如何避免iOS单双击UITapGestureRecognizer触发冲突?
解决iOS单击与双击手势冲突的问题
嘿,这个手势冲突的坑我踩过好多次了!你现在的问题核心在于错误地互相设置了失败依赖——tapToWatch.require(toFail: doubleLike)和doubleLike.require(toFail: tapToWatch)同时设置的话,相当于要求两个手势都识别失败才能触发对方,这完全逻辑颠倒了,肯定不会生效。
正确的解决思路
我们需要告诉系统:先尝试识别双击手势,如果双击手势识别失败(也就是用户只点了一次),再触发单击手势。只需要给单击手势设置依赖于双击手势失败即可,不需要反过来设置。
修改后的代码
// 单击手势 let tapToWatch = UITapGestureRecognizer(target: self, action: #selector(goWatchVideo)) tapToWatch.numberOfTapsRequired = 1 postVideoView.addGestureRecognizer(tapToWatch) // 双击手势 let doubleLike = UITapGestureRecognizer(target: self, action:#selector(self.onDoubleTap)) doubleLike.numberOfTapsRequired = 2 postVideoView.addGestureRecognizer(doubleLike) // 仅设置单击依赖于双击失败——关键修正! tapToWatch.require(toFail: doubleLike)
额外注意点
- 系统会自动给双击手势预留一小段超时时间(等待是否有第二次点击),这个时间是系统默认的,不需要我们手动调整
- 如果你的视图还有其他交互(比如滚动、长按等),可以检查
cancelsTouchesInView属性,默认是true,一般不需要修改,但如果有冲突可以根据情况调整 - 手势的添加顺序不影响这个依赖逻辑,只要正确设置了
require(toFail:)就行
内容的提问来源于stack exchange,提问作者vApp
相关产品推荐
相关产品推荐

