| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691 |
- //
- // KSVideoRecordViewController.m
- // MusicGradeExam
- //
- // Created by Kyle on 2020/10/16.
- // Copyright © 2020 DayaMusic. All rights reserved.
- //
- #import "KSVideoRecordViewController.h"
- #import "AppDelegate.h"
- #import "UIDevice+TFDevice.h"
- #import <AVFoundation/AVFoundation.h>
- #import <AssetsLibrary/AssetsLibrary.h>
- #import "KSNormalAlertView.h"
- #import "SubjectImageModel.h"
- #import "TZImageManager.h"
- @interface KSVideoRecordViewController ()<AVCaptureFileOutputRecordingDelegate>
- @property (nonatomic, strong) AVAudioPlayer *audioPlayer;
- //会话 负责输入和输出设备之间的数据传递
- @property (nonatomic, strong) AVCaptureSession *captureSession;
- @property (nonatomic, strong) AVCaptureDeviceInput *videoCaptureDeviceInput;
- @property (nonatomic, strong) AVCaptureDeviceInput *audioCaptureDeviceInput;
- // 视频流输出
- @property (nonatomic, strong) AVCaptureMovieFileOutput *captureMovieFileOutput;
- // 相机拍摄预览图层
- @property (nonatomic, strong) AVCaptureVideoPreviewLayer *captureVideoPreviewLayer;
- // 自定义UI控件容器
- @property (nonatomic, strong) UIView *viewContainer;
- // 录制时常
- @property (nonatomic, strong) UILabel *timeLabel;
- // 计时器
- @property (nonatomic, strong) NSTimer *timer;
- @property (nonatomic, strong) UIButton *bottomButton;
- @property (nonatomic, strong) SubjectImageModel *guideImageModel;
- @property (nonatomic, strong) UIImageView *tipsImage;
- @property (nonatomic, assign) NSInteger prepareTime;
- @property (nonatomic, assign) BOOL isPrepare;
- @property (nonatomic, strong) UILabel *bottomCountLabel;
- @property (nonatomic, assign) NSInteger currentRecordIndex;
- @property (nonatomic, strong) UILabel *topTipsLabel;
- @property (nonatomic, strong) UIView *topTipsView;
- @property (nonatomic, strong) UIImageView *warningImage;
- @property (nonatomic, assign) NSInteger duration;
- @property (nonatomic, copy) VideoRecordBlock callback;
- @property (nonatomic, strong) NSMutableArray *videoAssetArray;
- @property (nonatomic, assign) BOOL isStartExam;
- @property (nonatomic, assign) BOOL isRecording;
- @property (nonatomic, assign) BOOL isQuiting;
- @property (nonatomic, strong) UIView *songCardView;
- @property (nonatomic, strong) UILabel *subjectLabel;
- @property (nonatomic, strong) UILabel *songTitle;
- @property (nonatomic, strong) UILabel *songNameLabel;
- @property (nonatomic, strong) UILabel *songTimeLabel;
- @property (nonatomic, assign) NSInteger songCountTime;
- @end
- @implementation KSVideoRecordViewController
- - (void)viewWillAppear:(BOOL)animated {
- [super viewWillAppear:animated];
- self.zh_statusBarHidden = YES;
- // 切换到横屏
- AppDelegate* delegate = (AppDelegate*)[UIApplication sharedApplication].delegate;
- delegate.allowAutoRotate = YES;
- [UIDevice switchNewOrientation:UIInterfaceOrientationLandscapeRight];
- [[UIApplication sharedApplication] setIdleTimerDisabled:YES];
- }
- - (void)viewWillDisappear:(BOOL)animated {
- [super viewWillDisappear:animated];
- // 竖屏
- AppDelegate* delegate = (AppDelegate*)[UIApplication sharedApplication].delegate;
- delegate.allowAutoRotate = NO;
- [UIDevice switchNewOrientation:UIInterfaceOrientationPortrait];
- [[UIApplication sharedApplication] setIdleTimerDisabled:NO];
- self.zh_statusBarHidden = NO;
- }
- - (void)viewDidLoad {
- [super viewDidLoad];
- // Do any additional setup after loading the view.
- self.view.backgroundColor = HexRGB(0x141414);
- [self configMessage];
- // 切换到横屏
- AppDelegate* delegate = (AppDelegate*)[UIApplication sharedApplication].delegate;
- delegate.allowAutoRotate = YES;
- [UIDevice switchNewOrientation:UIInterfaceOrientationLandscapeRight];
- [self configUI];
- [self.timer setFireDate:[NSDate distantPast]];
- }
- - (void)configMessage {
- self.prepareTime = 10;
- self.currentRecordIndex = 0;
- }
- - (void)configUI {
- _captureSession = [[AVCaptureSession alloc] init];
- // 初始化会话对象
- if ([_captureSession canSetSessionPreset:AVCaptureSessionPresetInputPriority]) {
- _captureSession.sessionPreset = AVCaptureSessionPresetInputPriority;
- }
- NSError *error = nil;
-
- // 获取视频输出对象
- AVCaptureDevice *videoCaptureDevice = [self cameraDeviceWithPosition:(AVCaptureDevicePositionBack)];
- if (!videoCaptureDevice) {
- NSLog(@"获取后置摄像头失败!");
- return;
- }
- _videoCaptureDeviceInput = [[AVCaptureDeviceInput alloc] initWithDevice:videoCaptureDevice error:&error];
- if (error) {
- NSLog(@"取得视频设备输入对象错误");
- return;
- }
-
- // 获取音频输入对象
- AVCaptureDevice *audioCaptureDevice = [[AVCaptureDevice devicesWithMediaType:AVMediaTypeAudio] firstObject];
- _audioCaptureDeviceInput = [[AVCaptureDeviceInput alloc] initWithDevice:audioCaptureDevice error:&error];
- if (error) {
- NSLog(@"取得音频设备输入对象时出错");
- return;
- }
-
- // 初始化设备输出对象
- _captureMovieFileOutput = [[AVCaptureMovieFileOutput alloc] init];
- //将设备输入添加到会话中
- if ([_captureSession canAddInput:_videoCaptureDeviceInput]) {
- [_captureSession addInput:_videoCaptureDeviceInput];
- [_captureSession addInput:_audioCaptureDeviceInput];
-
- //防抖功能
- AVCaptureConnection *captureConnection = [_captureMovieFileOutput connectionWithMediaType:AVMediaTypeAudio];
- if ([captureConnection isVideoStabilizationSupported]) {
- captureConnection.preferredVideoStabilizationMode = AVCaptureVideoStabilizationModeAuto;
- }
- }
-
- //将设备输出添加到会话中
- if ([_captureSession canAddOutput:_captureMovieFileOutput]) {
- [_captureSession addOutput:_captureMovieFileOutput];
- }
-
- //创建视频预览图层
- _captureVideoPreviewLayer = [[AVCaptureVideoPreviewLayer alloc] initWithSession:_captureSession];
- self.viewContainer.layer.masksToBounds = YES;
- _captureVideoPreviewLayer.frame = self.viewContainer.bounds;
- _captureVideoPreviewLayer.videoGravity = AVLayerVideoGravityResizeAspectFill;
- _captureVideoPreviewLayer.connection.videoOrientation = AVCaptureVideoOrientationLandscapeRight;
- [self.view.layer addSublayer:_captureVideoPreviewLayer];
-
- [self.view addSubview:self.viewContainer];
- [self configSongCardView];
- self.songCardView.hidden = YES;
-
- dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1.0f * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
- [self playTipsWithFileName:@"tips_one"];
- });
-
- }
- - (void)playTipsWithFileName:(NSString *)fileName {
-
- // 播放提示音
- NSString *path = [[NSBundle mainBundle] pathForResource:fileName ofType:@"caf"];
- if (path) {
- NSURL *pathUrl = [NSURL fileURLWithPath:path];
- NSError *error = nil;
- self.audioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:pathUrl error:&error];
- self.audioPlayer.volume = 1.0f;
- [self.audioPlayer prepareToPlay];
- if (error == nil) {
- [self.audioPlayer play];
- }
- }
- }
- - (void)configSongCardView {
- [self.view addSubview:self.songCardView];
- [self.songCardView mas_makeConstraints:^(MASConstraintMaker *make) {
- make.width.mas_equalTo(180);
- make.right.mas_equalTo(self.view.mas_right);
- make.centerY.mas_equalTo(self.view.mas_centerY);
- }];
- self.songCardView.layer.cornerRadius = 5.0f;
-
- [self.songCardView addSubview:self.subjectLabel];
- self.subjectLabel.text = [NSString stringWithFormat:@"%@,%@", self.subjectName, self.leverName];
- [self.subjectLabel mas_makeConstraints:^(MASConstraintMaker *make) {
- make.left.mas_equalTo(self.songCardView.mas_left).offset(10);
- make.right.mas_equalTo(self.songCardView.mas_right).offset(10);
- make.top.mas_equalTo(self.songCardView.mas_top).offset(10);
- make.height.mas_equalTo(20);
- }];
- [self.songCardView addSubview:self.songTitle];
- [self.songTitle mas_makeConstraints:^(MASConstraintMaker *make) {
- make.left.mas_equalTo(self.songCardView.mas_left).offset(10);
- make.right.mas_equalTo(self.songCardView.mas_right).offset(10);
- make.top.mas_equalTo(self.subjectLabel.mas_bottom).offset(10);
- make.height.mas_equalTo(20);
- }];
-
- [self.songCardView addSubview:self.songNameLabel];
- self.songNameLabel.text = [self.songMessageArray firstObject];
- [self.songNameLabel mas_makeConstraints:^(MASConstraintMaker *make) {
- make.left.mas_equalTo(self.songCardView.mas_left).offset(10);
- make.right.mas_equalTo(self.songCardView.mas_right).offset(10);
- make.top.mas_equalTo(self.songTitle.mas_bottom).offset(10);
- }];
-
- [self.songCardView addSubview:self.songTimeLabel];
- [self.songTimeLabel mas_makeConstraints:^(MASConstraintMaker *make) {
- make.left.mas_equalTo(self.songCardView.mas_left).offset(10);
- make.right.mas_equalTo(self.songCardView.mas_right).offset(10);
- make.top.mas_equalTo(self.songNameLabel.mas_bottom).offset(10);
- make.bottom.mas_equalTo(self.songCardView.mas_bottom).offset(-10);
- }];
- self.songCountTime = self.singleSongRecordMinutes * 60;
- self.songTimeLabel.text = [NSString stringWithFormat:@"当前曲目剩余时间:%zds",self.songCountTime];
- }
- -(void)viewDidAppear:(BOOL)animated {
- [super viewDidAppear:animated];
- [self.captureSession startRunning];
- }
- -(void)viewDidDisappear:(BOOL)animated {
- [super viewDidDisappear:animated];
- [self.captureSession stopRunning];
- [self stopDurationTimer];
- }
- #pragma mark ---- buttonAction
- - (void)bottomButtonAction:(UIButton *)sender {
-
- if ([sender.titleLabel.text isEqualToString:@"已就位"]) {
- [self playTipsWithFileName:@"tips_second"];
- [sender setTitle:@"开始考级" forState:UIControlStateNormal];
- }
- else if ([sender.titleLabel.text isEqualToString:@"开始考级"]) {
- self.isPrepare = YES;
- self.topTipsLabel.text = @"请考生在10秒内就位演奏";
- [self playTipsWithFileName:@"tips_third"];
- self.topTipsView.hidden = NO;
- self.bottomCountLabel.hidden = NO;
- if (self.currentRecordIndex + 1 == self.songMessageArray.count) {
- [sender setTitle:@"完成录制" forState:UIControlStateNormal];
- }
- else {
- [sender setTitle:@"下一首" forState:UIControlStateNormal];
- }
- sender.hidden = YES;
- }
- else if ([sender.titleLabel.text isEqualToString:@"下一首"]) {
-
- [KSNormalAlertView ks_showAlertWithTitle:@"确定切换下一首吗?" leftTitle:@"取消" rightTitle:@"确定" cancel:^{
-
- } confirm:^{
- [self nextSongAction];
- }];
-
- }
- else if ([sender.titleLabel.text isEqualToString:@"完成录制"]) {
- [KSNormalAlertView ks_showAlertWithTitle:@"确定完成录制吗?" leftTitle:@"取消" rightTitle:@"确定" cancel:^{
-
- } confirm:^{
- // 退出录播 返回数据
- if (self.isRecording) {
- if ([self.captureMovieFileOutput isRecording]) {
- [self.captureMovieFileOutput stopRecording];
- }
- self.isQuiting = YES;
- [MBProgressHUD ksShowHUDWithText:@"视频保存中..."];
- }
- else {
- self.callback(VIDEORECORDACTION_BACK, self.videoAssetArray);
- [self quitRecordExam];
- }
- }];
-
- }
- }
- - (void)nextSongAction {
- self.currentRecordIndex++;
- self.topTipsLabel.text = @"请考生在10秒内就位演奏";
- self.prepareTime = 10;
- self.isPrepare = YES;
- [self.captureMovieFileOutput stopRecording];
- if (self.currentRecordIndex + 1 == self.songMessageArray.count) {
- [self.bottomButton setTitle:@"完成录制" forState:UIControlStateNormal];
- }
- else {
- [self.bottomButton setTitle:@"下一首" forState:UIControlStateNormal];
- }
- self.bottomButton.hidden = YES;
- }
- - (void)setCurrentRecordIndex:(NSInteger)currentRecordIndex {
- _currentRecordIndex = currentRecordIndex;
- self.songCountTime = self.singleSongRecordMinutes * 60;
- self.songTimeLabel.text = [NSString stringWithFormat:@"当前曲目剩余时间:%zds",self.songCountTime];
- if (self.songMessageArray.count > currentRecordIndex) {
- NSString *songName = self.songMessageArray[currentRecordIndex];
- self.songNameLabel.text = songName;
- }
-
- }
- #pragma mark -------- AVCaptureFileOutputRecordingDelegate ----------
- - (void)captureOutput:(AVCaptureFileOutput *)captureOutput didStartRecordingToOutputFileAtURL:(NSURL *)fileURL fromConnections:(NSArray *)connections {
- NSLog(@"开始录制");
- _isRecording = YES;
- }
-
- - (void)captureOutput:(AVCaptureFileOutput *)captureOutput didFinishRecordingToOutputFileAtURL:(NSURL *)outputFileURL fromConnections:(NSArray *)connections error:(NSError *)error {
- NSLog(@"录制结束");
- // 是否保存到相册
- [[TZImageManager manager] saveVideoWithUrl:outputFileURL completion:^(PHAsset *asset, NSError *error) {
- self.isRecording = NO;
- // 删除文件
- [self removeVideoWithPath:outputFileURL.path];
- // 记录当前相册asset
- [self.videoAssetArray addObject:asset];
- if (self.isQuiting) { // 保存完成退出
- [MBProgressHUD ksHideHUD];
- self.callback(VIDEORECORDACTION_BACK, self.videoAssetArray);
- [self quitRecordExam];
- }
- }];
- }
- - (void)removeVideoWithPath:(NSString *)videoUrl {
- NSFileManager *fileMamager = [NSFileManager defaultManager];
- if ([fileMamager fileExistsAtPath:videoUrl]) {
- [fileMamager removeItemAtPath:videoUrl error:nil];
- }
- }
- /**取得指定位置的摄像头*/
- - (AVCaptureDevice *)cameraDeviceWithPosition:(AVCaptureDevicePosition)position {
- NSArray *cameras = [AVCaptureDevice devicesWithMediaType:AVMediaTypeVideo];
- for (AVCaptureDevice *camera in cameras) {
- if ([camera position] == position) {
- return camera;
- }
- }
- return nil;
- }
- #pragma mark ---- lazying
- // 乐曲卡片
- - (UIView *)songCardView {
- if (!_songCardView) {
- _songCardView = [[UIView alloc] init];
- _songCardView.backgroundColor = HexRGBAlpha(0x141414, 0.5f);
- }
- return _songCardView;
- }
- - (UILabel *)subjectLabel {
- if (!_subjectLabel) {
- _subjectLabel = [[UILabel alloc] init];
- _subjectLabel.textColor = HexRGB(0xffffff);
- _subjectLabel.font = [UIFont systemFontOfSize:14.0f];
- }
- return _subjectLabel;
- }
- - (UILabel *)songTitle {
- if (!_songTitle) {
- _songTitle = [[UILabel alloc] init];
- _songTitle.textColor = THEMECOLOR;
- _songTitle.font = [UIFont systemFontOfSize:14.0f];
- _songTitle.text = @"当前曲目:";
- }
- return _songTitle;
- }
- - (UILabel *)songNameLabel {
- if (!_songNameLabel) {
- _songNameLabel = [[UILabel alloc] init];
- _songNameLabel.textColor = HexRGB(0xffffff);
- _songNameLabel.numberOfLines = 0;
- _songNameLabel.font = [UIFont systemFontOfSize:14.0f];
- }
- return _songNameLabel;
- }
- - (UILabel *)songTimeLabel {
- if (!_songTimeLabel) {
- _songTimeLabel = [[UILabel alloc] init];
- _songTimeLabel.textColor = HexRGB(0xffffff);
- _songTimeLabel.font = [UIFont systemFontOfSize:14.0f];
- }
- return _songTimeLabel;
- }
- - (NSMutableArray *)videoAssetArray {
- if (!_videoAssetArray) {
- _videoAssetArray = [NSMutableArray arrayWithCapacity:self.songMessageArray.count];
- }
- return _videoAssetArray;
- }
- - (UILabel *)timeLabel {
- if (!_timeLabel) {
- _timeLabel = [[UILabel alloc] init];
- _timeLabel.font = [UIFont systemFontOfSize:14.0f];
- _timeLabel.textColor = HexRGB(0xffffff);
-
- }
- return _timeLabel;
- }
- - (void)configTime:(NSInteger)subTime recordFinishBlock:(VideoRecordBlock)block {
- if (block) {
- self.callback = block;
- }
- self.duration = subTime;
- }
- - (void)setDuration:(NSInteger)duration {
- _duration = duration;
- if (_duration < 300) {
- // self.timeLabel.textColor = HexRGB(0xff3535);
- }
- if (_duration < 0) {
- [self stopDurationTimer];
- if (self.callback) {
- self.callback(VIDEORECORDACTION_OVER,self.videoAssetArray);
- }
- }
- }
- - (void)stopDurationTimer {
- [self.timer setFireDate:[NSDate distantFuture]];
- if (self.timer.valid) {
- [self.timer invalidate];
- self.timer = nil;
- }
- }
- - (NSString *)formatTime {
-
- if (self.duration < 0) {
- return @"00分00秒";
- }
- NSInteger durationInteger = self.duration--;
- NSInteger durationS = durationInteger % 60;
- NSInteger durationM = (durationInteger - durationS) / 60;
- NSString *minuteStr = [NSString stringWithFormat:@"%02ld", durationM];
- NSString *secondStr = [NSString stringWithFormat:@"%02ld", durationS];
-
- return [NSString stringWithFormat:@"%@分%@秒", minuteStr, secondStr];
- }
- - (UILabel *)topTipsLabel {
- if (!_topTipsLabel) {
- _topTipsLabel = [[UILabel alloc] init];
- _topTipsLabel.font = [UIFont systemFontOfSize:14.0f];
- _topTipsLabel.textColor = HexRGB(0x00ffef);
- }
- return _topTipsLabel;
- }
- - (NSTimer *)timer {
- if (_timer == nil) {
- _timer = [NSTimer scheduledTimerWithTimeInterval:1
- target:self
- selector:@selector(timeFunction:)
- userInfo:nil
- repeats:YES];
- [[NSRunLoop currentRunLoop] addTimer:_timer forMode:NSRunLoopCommonModes];
- }
- return _timer;
- }
- - (void)timeFunction:(NSTimer *)timer {
- if (self.isPrepare) {
- if (self.prepareTime > 0) {
- self.bottomCountLabel.text = [NSString stringWithFormat:@"%zds",self.prepareTime];
- self.bottomCountLabel.hidden = NO;
- self.prepareTime--;
- }
- else {
- self.isStartExam = YES;
- self.isPrepare = NO;
- self.topTipsLabel.text = @"正在考级,学生必须保持在画面之内";
- self.songCardView.hidden = NO;
- self.bottomCountLabel.hidden = YES;
- self.bottomButton.hidden = NO;
- NSString *path = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)lastObject] stringByAppendingPathComponent:@"VideoData"];
- NSFileManager *fileManager = [NSFileManager defaultManager];
- BOOL isDir = FALSE;
- BOOL isDirExist = [fileManager fileExistsAtPath:path isDirectory:&isDir];
- if(!(isDirExist && isDir)) {
- BOOL bCreateDir = [fileManager createDirectoryAtPath:path withIntermediateDirectories:YES attributes:nil error:nil];
- if(!bCreateDir){
- NSLog(@"创建文件夹失败!");
- }
- NSLog(@"创建文件夹成功,文件路径%@",path);
- }
- NSString *songName = [[self.songMessageArray objectAtIndex:self.currentRecordIndex] MD5];
- NSString *fileName = [NSString stringWithFormat:@"%@.mp4",songName];
- NSString *filePath = [path stringByAppendingPathComponent:fileName];
- NSLog(@"%@",filePath);
- [self.captureMovieFileOutput startRecordingToOutputFileURL:[NSURL fileURLWithPath:filePath] recordingDelegate:self];
- }
- }
- else {
- if (_isStartExam) {
- self.songCountTime--;
- if (self.songCountTime >= 0) {
- self.songTimeLabel.text = [NSString stringWithFormat:@"当前曲目剩余时间:%zds",self.songCountTime];
- }
- if (self.songCountTime == 0) {
- _isStartExam = NO;
- // 切换下一首
- [self nextSongAction];
- }
- }
- }
- self.timeLabel.text = [NSString stringWithFormat:@"考级剩余:%@",[self formatTime]];
- }
- - (UIImageView *)tipsImage {
- if (!_tipsImage) {
- _tipsImage = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, kScreenWidth, kScreenHeight)];
- }
- return _tipsImage;
- }
- - (SubjectImageModel *)guideImageModel {
- if (!_guideImageModel) {
- _guideImageModel = [[SubjectImageModel alloc] init];
- _guideImageModel.subjectName = self.subjectName;
- }
- return _guideImageModel;
- }
- - (UIButton *)bottomButton {
- if (!_bottomButton) {
- _bottomButton = [UIButton buttonWithType:UIButtonTypeCustom];
- [_bottomButton setTitle:@"已就位" forState:UIControlStateNormal];
- _bottomButton.frame = CGRectMake(kScreenWidth - 120 - 20, 10, 120, 44);
- _bottomButton.layer.cornerRadius = 22;
- _bottomButton.titleLabel.font = [UIFont systemFontOfSize:14.0f];
- _bottomButton.backgroundColor = HexRGB(0xff5a5a);
- [_bottomButton addTarget:self action:@selector(bottomButtonAction:) forControlEvents:UIControlEventTouchUpInside];
- }
- return _bottomButton;
- }
- - (UIView *)topTipsView {
- if (!_topTipsView) {
- _topTipsView = [[UIView alloc] init];
- _warningImage = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"warning_image"]];
- _warningImage.frame = CGRectMake(0, 4, 14, 12);
- [_topTipsView addSubview:_warningImage];
- [_topTipsView addSubview:self.topTipsLabel];
- }
- return _topTipsView;
- }
- - (UIView *)viewContainer {
- if (!_viewContainer) {
- _viewContainer = [[UIView alloc] initWithFrame:CGRectMake(0, 0, kScreenWidth, kScreenHeight)];
-
- // 声部示意图
- NSString *tipsImageName = self.guideImageModel.guideImage;
- if (![NSString isEmptyString:tipsImageName]) {
- [self.tipsImage setImage:[UIImage imageNamed:tipsImageName]];
- [self.viewContainer addSubview:self.tipsImage];
- }
-
- UIView *headView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, kScreenWidth, 64)];
- headView.backgroundColor = HexRGBAlpha(0x141414, 0.5f);
- [_viewContainer addSubview:headView];
-
- UIButton *cancleButton = [UIButton buttonWithType:UIButtonTypeCustom];
- cancleButton.frame = CGRectMake(kScreenWidth - 120 - iPhoneXSafeBottomMargin, 0, 120, 64);
- cancleButton.titleLabel.font = [UIFont systemFontOfSize:14.0f];
- [cancleButton addTarget:self action:@selector(cancleRecordAction) forControlEvents:UIControlEventTouchUpInside];
- [cancleButton setTitle:@"放弃本次录制" forState:UIControlStateNormal];
- [headView addSubview:cancleButton];
- [headView addSubview:self.topTipsView];
- [self.topTipsView mas_makeConstraints:^(MASConstraintMaker *make) {
- make.centerX.mas_equalTo(headView.mas_centerX);
- make.centerY.mas_equalTo(headView.mas_centerY);
- make.height.mas_equalTo(20);
- }];
- [self.topTipsLabel mas_makeConstraints:^(MASConstraintMaker *make) {
- make.top.bottom.right.mas_equalTo(self.topTipsView);
- make.left.mas_equalTo(self.warningImage.mas_right).offset(5);
- }];
- self.topTipsView.hidden = YES;
- [headView addSubview:self.timeLabel];
- [self.timeLabel mas_makeConstraints:^(MASConstraintMaker *make) {
- make.left.mas_equalTo(headView.mas_left).offset(15);
- make.centerY.mas_equalTo(headView.mas_centerY);
- make.height.mas_equalTo(20);
- }];
-
-
- UIView *bottomView = [[UIView alloc] initWithFrame:CGRectMake(0, kScreenHeight - 64, kScreenWidth, 64)];
- bottomView.backgroundColor = HexRGBAlpha(0x141414, 0.5f);
- [_viewContainer addSubview:bottomView];
-
- [bottomView addSubview:self.bottomButton];
-
- [bottomView addSubview:self.bottomCountLabel];
- [self.bottomCountLabel mas_makeConstraints:^(MASConstraintMaker *make) {
- make.height.mas_equalTo(20);
- make.center.mas_equalTo(bottomView);
- make.width.mas_equalTo(40);
- }];
- self.bottomCountLabel.hidden = YES;
- }
- return _viewContainer;
- }
- - (UILabel *)bottomCountLabel {
- if (!_bottomCountLabel) {
- _bottomCountLabel = [[UILabel alloc] init];
- _bottomCountLabel.textColor = [UIColor whiteColor];
- _bottomCountLabel.font = [UIFont systemFontOfSize:16.0f];
- }
- return _bottomCountLabel;
- }
- - (void)cancleRecordAction {
- // 弹窗提示退出房间
- [KSNormalAlertView ks_showAlertWithTitle:@"确定退出录播吗?" leftTitle:@"取消" rightTitle:@"确定" cancel:^{
-
- } confirm:^{
- // 退出录播
- [self quitRecordExam];
- }];
- }
- - (void)quitRecordExam {
- [self dismissViewControllerAnimated:NO completion:^{
- if ([self.captureMovieFileOutput isRecording]) {
- [self.captureMovieFileOutput stopRecording];
- }
- }];
- }
- /*
- #pragma mark - Navigation
- // In a storyboard-based application, you will often want to do a little preparation before navigation
- - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
- // Get the new view controller using [segue destinationViewController].
- // Pass the selected object to the new view controller.
- }
- */
- @end
|