You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
240 lines
7.0 KiB
240 lines
7.0 KiB
// |
|
// RecordingBtn.m |
|
// myWear |
|
// |
|
// Created by xTT on 2017/3/13. |
|
// Copyright © 2017年 xTT. All rights reserved. |
|
// |
|
|
|
#import "RecordingBtn.h" |
|
#import "SVProgressHUD.h" |
|
|
|
#import "XHVoiceRecordHUD.h" |
|
#import "XHVoiceRecordHelper.h" |
|
#import "CJFileUtility.h" |
|
#import "VoiceConverter.h" |
|
#import "XHAudioPlayerHelper.h" |
|
|
|
@interface RecordingBtn() |
|
|
|
/** |
|
* 管理录音工具对象 |
|
*/ |
|
@property (nonatomic, strong) XHVoiceRecordHelper *voiceRecordHelper; |
|
@property (nonatomic, strong, readwrite) XHVoiceRecordHUD *voiceRecordHUD; |
|
|
|
/** |
|
* 判断是不是超出了录音最大时长 |
|
*/ |
|
@property (nonatomic) BOOL isMaxTimeStop; |
|
|
|
/** |
|
* 是否取消錄音 |
|
*/ |
|
@property (nonatomic, assign, readwrite) BOOL isCancelled; |
|
|
|
/** |
|
* 是否正在錄音 |
|
*/ |
|
@property (nonatomic, assign, readwrite) BOOL isRecording; |
|
|
|
@end |
|
|
|
@implementation RecordingBtn |
|
|
|
-(void)layoutSubviews |
|
{ |
|
[super layoutSubviews]; |
|
self.layer.cornerRadius = self.frame.size.width / 2; |
|
CGFloat midX = self.frame.size.width / 2; |
|
CGFloat midY = self.frame.size.height/ 2 ; |
|
self.titleLabel.center = CGPointMake(midX, midY + 20); |
|
self.imageView.center = CGPointMake(midX, midY - 10); |
|
} |
|
|
|
- (void)initCellView:(baseModel *)cModel{ |
|
// btn.frame = CGRectMake(0, 0, 80 * FIX_SCREEN, 44 * FIX_SCREEN); |
|
self.backgroundColor = mainColor; |
|
[self setTitle:@"录音" forState:UIControlStateNormal]; |
|
[self setImage:[myHelper getImageWithName:@"录音"] |
|
forState:UIControlStateNormal]; |
|
|
|
[self addTarget:self action:@selector(holdDownButtonTouchDown) forControlEvents:UIControlEventTouchDown]; |
|
[self addTarget:self action:@selector(holdDownButtonTouchUpOutside) forControlEvents:UIControlEventTouchUpOutside]; |
|
[self addTarget:self action:@selector(holdDownButtonTouchUpInside) forControlEvents:UIControlEventTouchUpInside]; |
|
[self addTarget:self action:@selector(holdDownDragOutside) forControlEvents:UIControlEventTouchDragExit]; |
|
[self addTarget:self action:@selector(holdDownDragInside) forControlEvents:UIControlEventTouchDragEnter]; |
|
|
|
} |
|
|
|
- (XHVoiceRecordHUD *)voiceRecordHUD { |
|
if (!_voiceRecordHUD) { |
|
_voiceRecordHUD = [[XHVoiceRecordHUD alloc] initWithFrame:CGRectMake(0, 0, 140, 140)]; |
|
} |
|
return _voiceRecordHUD; |
|
} |
|
|
|
- (XHVoiceRecordHelper *)voiceRecordHelper { |
|
if (!_voiceRecordHelper) { |
|
_isMaxTimeStop = NO; |
|
|
|
WEAKSELF |
|
_voiceRecordHelper = [[XHVoiceRecordHelper alloc] init]; |
|
_voiceRecordHelper.maxTimeStopRecorderCompletion = ^{ |
|
|
|
// Unselect and unhilight the hold down button, and set isMaxTimeStop to YES. |
|
weakSelf.selected = NO; |
|
weakSelf.highlighted = NO; |
|
weakSelf.isMaxTimeStop = YES; |
|
|
|
[weakSelf finishRecorded]; |
|
}; |
|
_voiceRecordHelper.peakPowerForChannel = ^(float peakPowerForChannel) { |
|
weakSelf.voiceRecordHUD.peakPower = peakPowerForChannel; |
|
}; |
|
_voiceRecordHelper.maxRecordTime = kVoiceRecorderTotalTime;//20; |
|
} |
|
return _voiceRecordHelper; |
|
} |
|
|
|
- (void)holdDownButtonTouchDown { |
|
self.isCancelled = NO; |
|
self.isRecording = NO; |
|
|
|
WEAKSELF |
|
[self prepareRecordWithCompletion:^BOOL{ |
|
STRONGSELF |
|
|
|
//這邊要判斷回調回來的時候, 使用者是不是已經早就鬆開手了 |
|
if (strongSelf && !strongSelf.isCancelled) { |
|
strongSelf.isRecording = YES; |
|
[strongSelf startRecord]; |
|
return YES; |
|
} else { |
|
return NO; |
|
} |
|
|
|
}]; |
|
|
|
} |
|
|
|
- (void)holdDownButtonTouchUpOutside { |
|
|
|
//如果已經開始錄音了, 才需要做取消的動作, 否則只要切換 isCancelled, 不讓錄音開始. |
|
if (self.isRecording) { |
|
WEAKSELF |
|
[self.voiceRecordHUD cancelRecordCompled:^(BOOL fnished) { |
|
weakSelf.voiceRecordHUD = nil; |
|
}]; |
|
[self.voiceRecordHelper cancelledDeleteWithCompletion:^{ |
|
|
|
}]; |
|
} else { |
|
self.isCancelled = YES; |
|
} |
|
} |
|
|
|
- (void)holdDownButtonTouchUpInside { |
|
|
|
//如果已經開始錄音了, 才需要做結束的動作, 否則只要切換 isCancelled, 不讓錄音開始. |
|
if (self.isRecording) { |
|
[self didFinishRecoingVoiceAction]; |
|
} else { |
|
self.isCancelled = YES; |
|
} |
|
} |
|
|
|
- (void)holdDownDragOutside { |
|
|
|
//如果已經開始錄音了, 才需要做拖曳出去的動作, 否則只要切換 isCancelled, 不讓錄音開始. |
|
if (self.isRecording) { |
|
[self.voiceRecordHUD resaueRecord]; |
|
} else { |
|
self.isCancelled = YES; |
|
} |
|
} |
|
|
|
- (void)holdDownDragInside { |
|
|
|
//如果已經開始錄音了, 才需要做拖曳回來的動作, 否則只要切換 isCancelled, 不讓錄音開始. |
|
if (self.isRecording) { |
|
[self.voiceRecordHUD pauseRecord]; |
|
} else { |
|
self.isCancelled = YES; |
|
} |
|
} |
|
|
|
#pragma mark - Voice Recording Helper Method |
|
|
|
- (void)prepareRecordWithCompletion:(XHPrepareRecorderCompletion)completion { |
|
[self.voiceRecordHelper prepareRecordingWithPath:[self getRecorderPath] prepareRecorderCompletion:completion]; |
|
} |
|
|
|
- (void)startRecord { |
|
[self.voiceRecordHUD startRecordingHUDAtView:[self topView]]; |
|
[self.voiceRecordHelper startRecordingWithStartRecorderCompletion:^{ |
|
}]; |
|
} |
|
|
|
- (void)finishRecorded { |
|
WEAKSELF |
|
[self.voiceRecordHUD stopRecordCompled:^(BOOL fnished) { |
|
weakSelf.voiceRecordHUD = nil; |
|
}]; |
|
[self.voiceRecordHelper stopRecordingWithStopRecorderCompletion:^{ |
|
if ([weakSelf.voiceRecordHelper.recordDuration integerValue] < 2) { |
|
[UICommon MessageErrorText:@"时间太短"]; |
|
}else if(weakSelf.voiceRecordHelper.recordPath){ |
|
weakSelf.block(@{@"voicePath":weakSelf.voiceRecordHelper.recordPath, |
|
@"duration":weakSelf.voiceRecordHelper.recordDuration}); |
|
} |
|
}]; |
|
} |
|
|
|
- (void)pauseRecord { |
|
[self.voiceRecordHUD pauseRecord]; |
|
} |
|
|
|
- (void)resumeRecord { |
|
[self.voiceRecordHUD resaueRecord]; |
|
} |
|
|
|
- (void)cancelRecord { |
|
WEAKSELF |
|
[self.voiceRecordHUD cancelRecordCompled:^(BOOL fnished) { |
|
weakSelf.voiceRecordHUD = nil; |
|
}]; |
|
[self.voiceRecordHelper cancelledDeleteWithCompletion:^{ |
|
|
|
}]; |
|
} |
|
|
|
- (void)didFinishRecoingVoiceAction { |
|
if (self.isMaxTimeStop == NO) { |
|
[self finishRecorded]; |
|
} else { |
|
self.isMaxTimeStop = NO; |
|
} |
|
} |
|
|
|
//获取根视图 |
|
-(UIView*)topView{ |
|
UIViewController *rootViewController = [UIApplication sharedApplication].keyWindow.rootViewController; |
|
return rootViewController.view; |
|
|
|
} |
|
|
|
#pragma mark - RecorderPath Helper Method |
|
|
|
- (NSString *)getRecorderPath { |
|
NSString *recorderPath = nil; |
|
recorderPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex: 0]; |
|
NSDate *now = [NSDate date]; |
|
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; |
|
[dateFormatter setDateFormat:@"yyyyMMddHHmmssSSS"]; |
|
recorderPath = [recorderPath stringByAppendingPathComponent:[dateFormatter stringFromDate:now]]; |
|
recorderPath = [recorderPath stringByAppendingPathExtension:@"wav"]; |
|
return recorderPath; |
|
} |
|
|
|
@end
|
|
|