iphone - 在 iPhone 上检测长按

标签 iphone objective-c cocoa-touch uikit ios

我正在开发一个 iPhone 应用程序,该应用程序要求我检查按钮是否已被点击并按住 6 秒钟,然后触发一个正在播放某种声音的 Action 。

我应该如何检测这 6 秒的点击?

另一方面,用户也可以继续点击按钮 6 秒,然后应该触发相同的操作。

我应该如何处理多次点击,我怎么知道所有的点击都在 6 秒括号内?

最佳答案

对于六秒长按,使用 UILongPressGestureRecognizerminimumPressDuration 属性设置为 6。

自己写gesture recognizer (例如,LongTappingGestureRecognizer)用于在给定时间段内连续点击;它不应该太棘手。给它一个属性,例如 UILongPressGestureRecognizerminimumPressDuration(例如,minimumTappingDuration)和一个属性(例如,maximumLiftTime)这决定了手指在不被视为长敲击手势之前可以抬起多长时间。

  • 当它第一次收到 touchesBegan:withEvent: 时, 记录时间。
  • 当它收到 touchesEnded:withEvent: 时, 启动 NSTimer (提升计时器)在 maximumLiftTime 之后向手势识别器发送取消消息(例如 cancelRecognition)。
  • 当它收到 touchesBegan:withEvent: 时有开始时间,取消电梯计时器(如果有)。
  • cancelRecognition 将转换为 failed state .

minimumTappingDuration 之后,有多种策略可用于处理手势结束时的识别。一种是检查 touchesBegan:withEvent:touchesEnded:withEvent: 处理程序,如果当前时间和开始时间之间的差异 >= minimumTappingDuration。这样做的问题是,如果用户缓慢敲击并且在达到 minimumTappingDuration 时手指向下,则识别手势的时间将比 minimumTappingDuration 长。另一种方法是在收到第一个 touchesBegan:withEvent: 时启动另一个 NSTimer(识别计时器),这将导致转换到 recognized state。并在 cancelRecognition 中取消。这里棘手的事情是如果在计时器触发时手指被抬起该怎么办。最好的方法可能是将两者结合起来,如果手指被抬起,则忽略识别计时器。

还有更多细节,但这就是要点。基本上,它是一个长按识别器,可以让用户将手指短暂地离开屏幕。您可能只使用点击识别器并跳过长按识别器。

关于iphone - 在 iPhone 上检测长按,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4013896/

相关文章:

ios - 委托(delegate)是否仍然不安全未保留?

IOS Swift 处理全局事件

iphone - 为 iphone 4 和 5 创建单独的 Storyboard

ios - 如何显示带有逆时针动画的自定义圆形进度条?

iphone - 依次运行 CABasicAnimation

objective-c - 如何在 iOS 中旋转时移动一个 UIView?

iphone - CFURLCreateStringByAddingPercentEscapes,奇怪的行为?

objective-c - 我可以在同一个 session 中使用 AVCaptureVideoDataOutput 和 AVCaptureMovieFileOutput 吗?

ios - 当月使用 iOS 的天数?

iphone - 校准代码到 iphone 加速度计和陀螺仪数据