UILongPressGestureRecognizer IBAction触发异常:首次启动手势识别错误
解决长按手势识别器首次触发异常的问题
这问题我之前做项目时也踩过坑!本质是UIKit手势识别器的优先级判断逻辑在首次启动时的小问题,咱们一步步来解决:
问题根源
你设置的两个长按手势:
longPressGesture:时长>0.5s,0次轻击longPressTapGesture:时长>0.5s,1次轻击
两者的触发时长完全一致,但UIKit在应用刚启动时,对手势的初始触摸追踪会默认把第一次长按的触摸动作,误判为包含一次“轻击”(因为轻击的判断是短时间内的触摸抬起,而长按的初始阶段和轻击的前半段是重叠的)。再加上两个手势没有设置优先级依赖,导致第一次操作时,longPressTapGesture先“抢”到了触发权。
解决方案:设置手势识别依赖
最直接的办法是让longPressTapGesture必须等待longPressGesture识别失败后,才能触发,这样就能保证无轻击的长按优先被识别。
方法1:在Interface Builder里设置
- 选中你的
longPressTapGesture(要求1次轻击的那个) - 打开右侧的Attributes Inspector(属性检查器)
- 找到
Require Gesture Recognizer To Fail选项,点击下拉菜单选择longPressGesture
方法2:用代码设置(适合纯代码创建手势或者需要动态调整的场景)
在ViewController的viewDidLoad方法里添加一行代码:
longPressTapGesture.require(toFail: longPressGesture)
(如果是OC的话,对应的代码是:[self.longPressTapGesture requireGestureRecognizerToFail:self.longPressGesture];)
验证效果
设置完成后,首次启动应用长按屏幕,longPressGesture会优先被识别触发;当你想要触发longPressTapGesture时,只需要先轻击一次,紧接着长按(总时长超过0.5s),此时longPressGesture会因为不符合“0次轻击”的条件而识别失败,longPressTapGesture就会正常触发了。
内容的提问来源于stack exchange,提问作者Bevan
相关产品推荐
相关产品推荐

