CWChangeVoiceView.m 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158
  1. //
  2. // CWChangeVoiceView.m
  3. // QQVoiceDemo
  4. //
  5. // Created by chavez on 2017/10/11.
  6. // Copyright © 2017年 陈旺. All rights reserved.
  7. //
  8. #import "CWChangeVoiceView.h"
  9. #import "CWRecordStateView.h"
  10. #import "CWVoiceButton.h"
  11. #import "UIView+CWChat.h"
  12. #import "CWRecorder.h"
  13. #import "CWVoiceView.h"
  14. #import "CWVoiceChangePlayView.h"
  15. #import "CWFlieManager.h"
  16. //----------------------变声界面---------------------------------//
  17. @interface CWChangeVoiceView()<CWRecorderDelegate>
  18. @property (nonatomic, weak) CWRecordStateView *stateView;
  19. @property (nonatomic, weak) UIButton *voiceChangeBtn; // 录音按钮
  20. @property (nonatomic,weak) CWVoiceChangePlayView *playView;
  21. @end
  22. @implementation CWChangeVoiceView
  23. - (instancetype)initWithFrame:(CGRect)frame
  24. {
  25. self = [super initWithFrame:frame];
  26. if (self) {
  27. [self setupSubviews];
  28. }
  29. return self;
  30. }
  31. - (void)setupSubviews {
  32. [self stateView];
  33. [self voiceChangeBtn];
  34. // [self playView];
  35. }
  36. #pragma mark - subviews
  37. - (CWVoiceChangePlayView *)playView {
  38. if (_playView == nil) {
  39. CWVoiceChangePlayView *playView = [[CWVoiceChangePlayView alloc] initWithFrame:self.bounds];
  40. [(CWVoiceView *)self.superview.superview setState:CWVoiceStatePlay];
  41. [UIView transitionWithView:self duration:0.25 options:UIViewAnimationOptionTransitionCrossDissolve animations:^{
  42. [self addSubview:playView];
  43. } completion:nil];
  44. self.playView = playView;
  45. }
  46. return _playView;
  47. }
  48. - (CWRecordStateView *)stateView {
  49. if (_stateView == nil) {
  50. CWRecordStateView *stateView = [[CWRecordStateView alloc] initWithFrame:CGRectMake(0, 10, self.cw_width, 50)];
  51. stateView.recordState = CWRecordStateTouchChangeVoice;
  52. [self addSubview:stateView];
  53. _stateView = stateView;
  54. }
  55. return _stateView;
  56. }
  57. - (UIButton *)voiceChangeBtn {
  58. if (_voiceChangeBtn == nil) {
  59. UIButton *btn = [UIButton buttonWithType:UIButtonTypeCustom];
  60. [btn setImage:[UIImage imageNamed:@"aio_voiceChange_icon"] forState:UIControlStateNormal];
  61. btn.frame = CGRectMake(0, self.stateView.cw_bottom, btn.currentImage.size.width, btn.currentImage.size.height);
  62. // 手指按下
  63. [btn addTarget:self action:@selector(startRecorde:) forControlEvents:UIControlEventTouchDown];
  64. // 松开手指
  65. [btn addTarget:self action:@selector(endRecord:) forControlEvents:UIControlEventTouchUpInside];
  66. [btn addTarget:self action:@selector(endRecord:) forControlEvents:UIControlEventTouchUpOutside];
  67. btn.cw_centerX = self.cw_width / 2.0;
  68. [self addSubview:btn];
  69. _voiceChangeBtn = btn;
  70. }
  71. return _voiceChangeBtn;
  72. }
  73. #pragma mark - button events
  74. - (void)startRecorde:(UIButton *)btn {
  75. [CWRecorder shareInstance].delegate = self;
  76. // 设置状态 隐藏小圆点和三个标签
  77. [(CWVoiceView *)self.superview.superview setState:CWVoiceStateRecord];
  78. [self animationMicBtn:^(BOOL finished) {
  79. // NSString *path = [CWDocumentPath stringByAppendingPathComponent:@"test.wav"];
  80. // @"/Users/chavez/Desktop/test.wav"
  81. NSString *filePath = [CWFlieManager filePath];
  82. [[CWRecorder shareInstance] beginRecordWithRecordPath:filePath];
  83. }];
  84. }
  85. - (void)endRecord:(UIButton *)btn {
  86. NSTimeInterval t = 0;
  87. if (![CWRecorder shareInstance].isRecording) {
  88. t = 0.3;
  89. }
  90. dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(t * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
  91. self.stateView.recordState = CWRecordStateTouchChangeVoice; // 切换状态为按住变声
  92. [[CWRecorder shareInstance] endRecord]; // 停止录音
  93. [self.stateView endRecord]; // stateview的动画停止
  94. // 设置状态 显示小圆点和三个标签
  95. [(CWVoiceView *)self.superview.superview setState:CWVoiceStateDefault];
  96. if (t == 0) {
  97. NSLog(ASLocalizedString(@"跳转到变声界面"));
  98. self.playView = nil;
  99. [self playView];
  100. }else {
  101. NSLog(ASLocalizedString(@"录音时间太短"));
  102. }
  103. });
  104. }
  105. #pragma mark - button animation
  106. - (void)animationMicBtn:(void(^)(BOOL finished))completion {
  107. [UIView animateWithDuration:0.10 animations:^{
  108. self.voiceChangeBtn.transform = CGAffineTransformMakeScale(1.1, 1.1);
  109. } completion:^(BOOL finished) {
  110. [UIView animateWithDuration:0.05 animations:^{
  111. self.voiceChangeBtn.transform = CGAffineTransformIdentity;
  112. } completion:^(BOOL finished) {
  113. if (completion) {
  114. completion(finished);
  115. }
  116. }];
  117. }];
  118. }
  119. #pragma mark - CWRecorderDelegate
  120. - (void)recorderPrepare {
  121. // NSLog(ASLocalizedString(@"准备中......"));
  122. self.stateView.recordState = CWRecordStatePrepare;
  123. }
  124. - (void)recorderRecording {
  125. self.stateView.recordState = CWRecordStateRecording;
  126. // 设置状态view开始录音
  127. [self.stateView beginRecord];
  128. }
  129. - (void)recorderFailed:(NSString *)failedMessage {
  130. self.stateView.recordState = CWRecordStateTouchChangeVoice;
  131. NSLog(ASLocalizedString(@"失败:%@"),failedMessage);
  132. }
  133. @end