当前位置:   article > 正文

UIButton---按住录音,松开停止_uibutton按住说话

uibutton按住说话

这几天做到录音,要求是 按住录音,松开停止录音完成, 手拖到按钮外时取消录音

先看看UIControlEvent的解释

  1. UIControlEventTouchDown
  2. 单点触摸按下事件:用户点触屏幕,或者又有新手指落下的时候。
  3. UIControlEventTouchDownRepeat
  4. 多点触摸按下事件,点触计数大于1:用户按下第二、三、或第四根手指的时候。
  5. UIControlEventTouchDragInside
  6. 当一次触摸在控件窗口内拖动时。
  7. UIControlEventTouchDragOutside
  8. 当一次触摸在控件窗口之外拖动时。
  9. UIControlEventTouchDragEnter
  10. 当一次触摸从控件窗口之外拖动到内部时。
  11. UIControlEventTouchDragExit
  12. 当一次触摸从控件窗口内部拖动到外部时。
  13. UIControlEventTouchUpInside
  14. 所有在控件之内触摸抬起事件。
  15. UIControlEventTouchUpOutside
  16. 所有在控件之外触摸抬起事件(点触必须开始与控件内部才会发送通知)。
  17. UIControlEventTouchCancel
  18. 所有触摸取消事件,即一次触摸因为放上了太多手指而被取消,或者被上锁或者电话呼叫打断。
  19. UIControlEventTouchChanged
  20. 当控件的值发生改变时,发送通知。用于滑块、分段控件、以及其他取值的控件。你可以配置滑块控件何时发送通知,在滑块被放下时发送,或者在被拖动时发送。
  21. UIControlEventEditingDidBegin
  22. 当文本控件中开始编辑时发送通知。
  23. UIControlEventEditingChanged
  24. 当文本控件中的文本被改变时发送通知。
  25. UIControlEventEditingDidEnd
  26. 当文本控件中编辑结束时发送通知。
  27. UIControlEventEditingDidOnExit
  28. 当文本控件内通过按下回车键(或等价行为)结束编辑时,发送通知。
  29. UIControlEventAlltouchEvents
  30. 通知所有触摸事件。
  31. UIControlEventAllEditingEvents
  32. 通知所有关于文本编辑的事件。
  33. UIControlEventAllEvents
  34. 通知所有事件。


刚开始的时候 我是这么设置的

  1. #import "ViewController.h"
  2. @interface ViewController ()
  3. @property (nonatomic, strong) UIButton *recordButton;
  4. @property (nonatomic, strong) UIActivityIndicatorView *indicator;
  5. @end
  6. @implementation ViewController
  7. - (UIActivityIndicatorView *)indicator
  8. {
  9. if (!_indicator) {
  10. _indicator = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhiteLarge];
  11. _indicator.center = _recordButton.center;
  12. [self.view addSubview:_indicator];
  13. }
  14. return _indicator;
  15. }
  16. - (void)viewDidLoad {
  17. [super viewDidLoad];
  18. // Do any additional setup after loading the view, typically from a nib.
  19. _recordButton = [[UIButton alloc] initWithFrame:CGRectMake(100, 100, 100, 100)];
  20. _recordButton.backgroundColor = [UIColor redColor];
  21. // 开始
  22. [_recordButton addTarget:self action:@selector(recordStart:) forControlEvents:UIControlEventTouchDown];
  23. // 取消
  24. [_recordButton addTarget:self action:@selector(recordCancel:) forControlEvents: UIControlEventTouchDragExit | UIControlEventTouchUpOutside];
  25. //完成
  26. [_recordButton addTarget:self action:@selector(recordFinish:) forControlEvents:UIControlEventTouchUpInside];
  27. [self.view addSubview:_recordButton];
  28. _recordButton.layer.cornerRadius = 50;
  29. }
  30. - (void)recordStart:(UIButton *)button
  31. {
  32. [self.indicator startAnimating];
  33. [button setTitle:@"录制中" forState:UIControlStateNormal];
  34. NSLog(@"UIControlEventTouchDown---recordStart");
  35. }
  36. - (void)recordCancel:(UIButton *)button
  37. {
  38. if (self.indicator.isAnimating) {
  39. [self.indicator stopAnimating];
  40. }
  41. [self.recordButton setTitle:@"重新录制" forState:UIControlStateNormal];
  42. NSLog(@"UIControlEventTouchDragExit 和 UIControlEventTouchUpOutside---recordCancel");
  43. }
  44. - (void)recordFinish:(UIButton *)button
  45. {
  46. NSLog(@"UIControlEventTouchUpInside---recordFinish");
  47. [button setTitle:@"完成" forState:UIControlStateNormal];
  48. [self.indicator stopAnimating];
  49. }
这样会有个问题就是手已经滑到按钮边界外了 还没触发取消的 感觉有点奇怪

后来看了一下相关资料找到解决方法

参考:http://www.cnblogs.com/peterpan507/p/3632353.html?utm_source=tuicool

  1. - (BOOL)continueTrackingWithTouch:(UITouch *)touch withEvent:(UIEvent *)event
  2. {
  3. // 设置新的边界
  4. CGFloat boundsExtension = 25.0f;
  5. CGRect outerBounds = CGRectInset(self.bounds, -1 * boundsExtension, -1 * boundsExtension);
  6. // 判断触摸位置
  7. BOOL touchOutside = !CGRectContainsPoint(outerBounds, [touch locationInView:self]);
  8. if(touchOutside)
  9. {
  10. // 判断是UIControlEventTouchDragExit/UIControlEventTouchDragOutside
  11. BOOL previousTouchInside = CGRectContainsPoint(outerBounds, [touch previousLocationInView:self]);
  12. if(previousTouchInside)
  13. {
  14. [self sendActionsForControlEvents:UIControlEventTouchDragExit];
  15. }
  16. else
  17. {
  18. [self sendActionsForControlEvents:UIControlEventTouchDragOutside];
  19. }
  20. }
  21. // 如果不是想要修改的control event,返回原操作
  22. return [super continueTrackingWithTouch:touch withEvent:event];
  23. }
把触发区域缩小了 但是还是有个问题就是touchupinside的识别区域 也是超出按钮的 也就是说调完touupoutside以后(如果你距离按钮区域不远的话)还会再调用touchupinside的方法

增加一个标志来代表已经取消了

  1. - (void)recordStart:(UIButton *)button
  2. {
  3. _isCancel = NO;
  4. [self.indicator startAnimating];
  5. [self.recordButton setTitle:@"录制中" forState:UIControlStateNormal];
  6. }
  7. - (void)recordCancel:(UIButton *)button
  8. {
  9. _isCancel = YES;
  10. if (self.indicator.isAnimating) {
  11. [self.indicator stopAnimating];
  12. }
  13. [self.recordButton setTitle:@"重新录制" forState:UIControlStateNormal];
  14. }
  15. - (void)recordFinish:(UIButton *)button
  16. {
  17. if (!_isCancel) {
  18. [self.recordButton setTitle:@"完成" forState:UIControlStateNormal];
  19. [self.indicator stopAnimating];
  20. }
  21. }


声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/2023面试高手/article/detail/93559
推荐阅读
相关标签
  

闽ICP备14008679号