220 lines
7.8 KiB
Objective-C
220 lines
7.8 KiB
Objective-C
//
|
|
// AVCallViewController.m
|
|
// AVDemo
|
|
//
|
|
|
|
#import "AVCallViewController.h"
|
|
#import "SellyVideoCallViewController.h"
|
|
#import "SellyVideoCallConferenceController.h"
|
|
#import "AVConfigManager.h"
|
|
#import <Masonry/Masonry.h>
|
|
|
|
@interface AVCallViewController () <UITextFieldDelegate>
|
|
@property (nonatomic, strong) UITextField *channelIdTextField;
|
|
@property (nonatomic, strong) UIButton *callButton;
|
|
@property (nonatomic, strong) UIButton *conferenceButton;
|
|
@property (nonatomic, strong) UIView *containerView;
|
|
@end
|
|
|
|
@implementation AVCallViewController
|
|
|
|
- (void)viewDidLoad {
|
|
[super viewDidLoad];
|
|
self.view.backgroundColor = [UIColor systemBackgroundColor];
|
|
self.title = @"通话";
|
|
|
|
[self setupUI];
|
|
|
|
// 加载上次使用的频道ID
|
|
self.channelIdTextField.text = [[AVConfigManager sharedManager] loadCallChannelId];
|
|
}
|
|
|
|
- (void)setupUI {
|
|
// 创建容器视图
|
|
self.containerView = [[UIView alloc] init];
|
|
[self.view addSubview:self.containerView];
|
|
|
|
// 创建频道ID标签
|
|
UILabel *titleLabel = [[UILabel alloc] init];
|
|
titleLabel.text = @"频道ID";
|
|
titleLabel.font = [UIFont systemFontOfSize:16 weight:UIFontWeightMedium];
|
|
titleLabel.textColor = [UIColor labelColor];
|
|
[self.containerView addSubview:titleLabel];
|
|
|
|
// 创建频道ID输入框
|
|
self.channelIdTextField = [[UITextField alloc] init];
|
|
self.channelIdTextField.placeholder = @"请输入频道ID";
|
|
self.channelIdTextField.borderStyle = UITextBorderStyleRoundedRect;
|
|
self.channelIdTextField.font = [UIFont systemFontOfSize:16];
|
|
self.channelIdTextField.clearButtonMode = UITextFieldViewModeWhileEditing;
|
|
self.channelIdTextField.returnKeyType = UIReturnKeyDone;
|
|
self.channelIdTextField.delegate = self;
|
|
self.channelIdTextField.backgroundColor = [UIColor secondarySystemBackgroundColor];
|
|
[self.containerView addSubview:self.channelIdTextField];
|
|
|
|
// 创建音视频单聊按钮
|
|
self.callButton = [self createButtonWithTitle:@"音视频单聊"
|
|
icon:@"video"
|
|
action:@selector(callTapped)];
|
|
[self.containerView addSubview:self.callButton];
|
|
|
|
// 创建音视频会议按钮
|
|
self.conferenceButton = [self createButtonWithTitle:@"音视频会议"
|
|
icon:@"person.3"
|
|
action:@selector(conferenceTapped)];
|
|
[self.containerView addSubview:self.conferenceButton];
|
|
|
|
// 布局
|
|
[self.containerView mas_makeConstraints:^(MASConstraintMaker *make) {
|
|
make.center.equalTo(self.view);
|
|
make.width.equalTo(@320);
|
|
}];
|
|
|
|
[titleLabel mas_makeConstraints:^(MASConstraintMaker *make) {
|
|
make.top.left.equalTo(self.containerView);
|
|
make.right.equalTo(self.containerView);
|
|
}];
|
|
|
|
[self.channelIdTextField mas_makeConstraints:^(MASConstraintMaker *make) {
|
|
make.top.equalTo(titleLabel.mas_bottom).offset(8);
|
|
make.left.right.equalTo(self.containerView);
|
|
make.height.equalTo(@44);
|
|
}];
|
|
|
|
[self.callButton mas_makeConstraints:^(MASConstraintMaker *make) {
|
|
make.top.equalTo(self.channelIdTextField.mas_bottom).offset(32);
|
|
make.left.right.equalTo(self.containerView);
|
|
make.height.equalTo(@100);
|
|
}];
|
|
|
|
[self.conferenceButton mas_makeConstraints:^(MASConstraintMaker *make) {
|
|
make.top.equalTo(self.callButton.mas_bottom).offset(16);
|
|
make.left.right.equalTo(self.containerView);
|
|
make.height.equalTo(@100);
|
|
make.bottom.equalTo(self.containerView);
|
|
}];
|
|
}
|
|
|
|
- (UIButton *)createButtonWithTitle:(NSString *)title icon:(NSString *)iconName action:(SEL)action {
|
|
UIButton *button = [UIButton buttonWithType:UIButtonTypeSystem];
|
|
button.backgroundColor = [UIColor systemBlueColor];
|
|
button.layer.cornerRadius = 12;
|
|
button.clipsToBounds = YES;
|
|
|
|
// 创建图标
|
|
UIImageView *iconView = [[UIImageView alloc] initWithImage:[UIImage systemImageNamed:iconName]];
|
|
iconView.tintColor = [UIColor whiteColor];
|
|
iconView.contentMode = UIViewContentModeScaleAspectFit;
|
|
|
|
// 创建标题
|
|
UILabel *titleLabel = [[UILabel alloc] init];
|
|
titleLabel.text = title;
|
|
titleLabel.textColor = [UIColor whiteColor];
|
|
titleLabel.font = [UIFont systemFontOfSize:18 weight:UIFontWeightSemibold];
|
|
titleLabel.textAlignment = NSTextAlignmentCenter;
|
|
|
|
[button addSubview:iconView];
|
|
[button addSubview:titleLabel];
|
|
|
|
[iconView mas_makeConstraints:^(MASConstraintMaker *make) {
|
|
make.centerX.equalTo(button);
|
|
make.centerY.equalTo(button).offset(-15);
|
|
make.width.height.equalTo(@40);
|
|
}];
|
|
|
|
[titleLabel mas_makeConstraints:^(MASConstraintMaker *make) {
|
|
make.centerX.equalTo(button);
|
|
make.top.equalTo(iconView.mas_bottom).offset(8);
|
|
make.left.greaterThanOrEqualTo(button).offset(8);
|
|
make.right.lessThanOrEqualTo(button).offset(-8);
|
|
}];
|
|
|
|
[button addTarget:self action:action forControlEvents:UIControlEventTouchUpInside];
|
|
|
|
return button;
|
|
}
|
|
|
|
#pragma mark - Button Actions
|
|
|
|
- (void)callTapped {
|
|
NSString *channelId = [self.channelIdTextField.text stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
|
|
|
|
// 验证输入
|
|
if (channelId.length == 0) {
|
|
[self showErrorAlert:@"频道ID不能为空"];
|
|
return;
|
|
}
|
|
|
|
// 保存频道 ID
|
|
[[AVConfigManager sharedManager] saveCallChannelId:channelId];
|
|
|
|
// 创建并跳转到视频通话页面
|
|
SellyVideoCallViewController *vc = [[SellyVideoCallViewController alloc] init];
|
|
vc.channelId = channelId;
|
|
vc.videoConfig = SellyRTCVideoConfiguration.defaultConfig;
|
|
|
|
// 隐藏底部 TabBar
|
|
vc.hidesBottomBarWhenPushed = YES;
|
|
|
|
[self.navigationController pushViewController:vc animated:YES];
|
|
}
|
|
|
|
- (void)conferenceTapped {
|
|
NSString *channelId = [self.channelIdTextField.text stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
|
|
|
|
// 验证输入
|
|
if (channelId.length == 0) {
|
|
[self showErrorAlert:@"频道ID不能为空"];
|
|
return;
|
|
}
|
|
|
|
// 保存频道 ID
|
|
[[AVConfigManager sharedManager] saveCallChannelId:channelId];
|
|
|
|
// 创建并跳转到视频会议页面
|
|
SellyVideoCallConferenceController *vc = [[SellyVideoCallConferenceController alloc] init];
|
|
vc.channelId = channelId;
|
|
vc.videoConfig = SellyRTCVideoConfiguration.defaultConfig;
|
|
|
|
// 隐藏底部 TabBar
|
|
vc.hidesBottomBarWhenPushed = YES;
|
|
|
|
[self.navigationController pushViewController:vc animated:YES];
|
|
}
|
|
|
|
#pragma mark - Helper Methods
|
|
|
|
- (void)showErrorAlert:(NSString *)message {
|
|
UIAlertController *errorAlert = [UIAlertController alertControllerWithTitle:@"错误"
|
|
message:message
|
|
preferredStyle:UIAlertControllerStyleAlert];
|
|
UIAlertAction *okAction = [UIAlertAction actionWithTitle:@"确定"
|
|
style:UIAlertActionStyleDefault
|
|
handler:nil];
|
|
[errorAlert addAction:okAction];
|
|
[self presentViewController:errorAlert animated:YES completion:nil];
|
|
}
|
|
|
|
#pragma mark - UITextFieldDelegate
|
|
|
|
- (BOOL)textFieldShouldReturn:(UITextField *)textField {
|
|
[textField resignFirstResponder];
|
|
return YES;
|
|
}
|
|
|
|
#pragma mark - Orientation Support (强制只支持竖屏)
|
|
|
|
- (BOOL)shouldAutorotate {
|
|
return YES;
|
|
}
|
|
|
|
- (UIInterfaceOrientationMask)supportedInterfaceOrientations {
|
|
return UIInterfaceOrientationMaskPortrait;
|
|
}
|
|
|
|
- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation {
|
|
return UIInterfaceOrientationPortrait;
|
|
}
|
|
|
|
@end
|