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.

241 lines
7.0 KiB

//
// RecordingBtn.m
// myWear
//
// Created by xTT on 2017/3/13.
// Copyright © 2017xTT. 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