UITapGestureRecognizer - 检测双击或三次轻击?

Posted

技术标签:

【中文标题】UITapGestureRecognizer - 检测双击或三次轻击?【英文标题】:UITapGestureRecognizer - detect double OR triple tap? 【发布时间】:2013-12-30 21:07:14 【问题描述】:

我有一个案例,在特定视图上双击和三击需要发生 2 种完全不同的行为。我设置的很标准,代码如下:

UITapGestureRecognizer *gestureRecognizerDoubleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(doubleTapDetected:)];
[gestureRecognizerDoubleTap setNumberOfTapsRequired:2];
[self.theView addGestureRecognizer:gestureRecognizerDoubleTap];

UITapGestureRecognizer *gestureRecognizerTripleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tripleTapDetected:)];
[gestureRecognizerTripleTap setNumberOfTapsRequired:3];
[self.theView addGestureRecognizer:gestureRecognizerTripleTap];

我遇到的问题是,如果完成了三次点击,双击方法也会被触发,因为它会在第三次之前检测到两次点击。因此,在轻按三次时,两种方法都会被调用。

显然这不是代码或底层 SDK 的固有问题,因为这是完全可以预料的。但是,我很好奇是否有人有一个聪明的方法来阻止双击功能在完成三击时被调用?我假设我可能必须在延迟计时器上设置双击功能(这将等待一秒钟以确认是否完成了三次轻击),但我不确定是否有更好的方法,甚至以干净的方式设置这种东西的最佳方法?

提前感谢您对此提供的任何建议!

【问题讨论】:

【参考方案1】:

你可以使用requireGestureRecognizerToFail:来解决这个问题:

UITapGestureRecognizer *gestureRecognizerTripleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tripleTapDetected:)];
[gestureRecognizerTripleTap setNumberOfTapsRequired:3];
[self.theView addGestureRecognizer:gestureRecognizerTripleTap];

UITapGestureRecognizer *gestureRecognizerDoubleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(doubleTapDetected:)];
[gestureRecognizerDoubleTap requireGestureRecognizerToFail:gestureRecognizerTripleTap];
[gestureRecognizerDoubleTap setNumberOfTapsRequired:2];
[self.theView addGestureRecognizer:gestureRecognizerDoubleTap];

除非三击失败,否则双击不会触发。

The class reference 和往常一样,有一些额外的信息,并提到这种情况是使用此方法的好时机。

【讨论】:

太棒了!我实际上不知道这种方法。我添加了这段代码,并且开箱即用,它可以完美地工作并且符合预期,我最初的尝试只增加了一行代码。很好的解决方案,谢谢! 我在堆栈溢出中遇到的最有用的答案【参考方案2】:

如何创建 2 个识别器,分别用于 1 次和 2 次点击(通过 numberOfTapsRequired 配置它们)。这显然会负责检测 1 次和 2 次抽头。要检测 3 次点击,您可以检查 1 次点击识别器是否在 2 次点击后立即触发。


顺便说一句,虽然我不知道您的应用程序是做什么的,但同时具有三次和双击手势似乎是一个潜在的可用性问题。三击本身并不是与应用程序交互的常见方式。我至少会考虑长按而不是三次点击。这将完全回避这个技术挑战:)

【讨论】:

有趣的解决方案。我会试一试,让你知道。关于你的第二点,我完全同意。这是客户的要求,即使经过一些尝试的回击,这也是他们真正想要的东西,所以我们不得不实施.. :( 感谢您提供潜在的解决方案!

以上是关于UITapGestureRecognizer - 检测双击或三次轻击?的主要内容,如果未能解决你的问题,请参考以下文章

使用 UITapGestureRecognizer 无法识别的选择器

UIlabel 中的 UITapGestureRecognizer 错误

UITapGestureRecognizer 的问题

带有点击事件的 UITapGestureRecognizer

UIButton 上的 UITapGestureRecognizer

为啥 UIButton 会覆盖 UITapGestureRecognizer?