UITapGestureRecognizer - 如何检测双击或三击操作?

4

我有一个案例,其中需要在特定视图上进行双击和三连击时执行两种完全不同的行为。我使用了下面的代码来设置它:

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];

我遇到的问题是,如果三次轻击(triple-tap),那么双击方法也会被触发,因为它在第三次轻击之前检测到了两次。因此,在三次轻击时,两种方法都被调用了。
显然,这不是代码或底层SDK的固有问题,因为这是完全可预料的。但是,我想知道是否有人有巧妙的方法来防止在进行三次轻击时调用双击功能?我假设可能需要在延迟计时器上设置双击功能(等待片刻确认是否进行了三次轻击),但我不确定是否有更好的方法,或者以干净的方式设置这种功能的最佳方法?
非常感谢您提供的任何建议!
2个回答

10

您可以使用 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];

只有当三次连击失败时,双击才会触发。

通常情况下,类参考文档提供了更多信息,并提到这种情况是使用此方法的最佳时机。


太棒了!我之前并不知道这个方法。我加入了这段代码,直接就完美地按照预期工作了,而且只需要在我的原始尝试中再添加一行代码。非常好的解决方案,谢谢! - svguerin3
我在Stack Overflow上遇到的最有用的答案。 - Ros

1
如何创建两个识别器,分别用于1和2次轻拍(通过numberOfTapsRequired进行配置)。这显然可以检测到1和2次轻拍。要检测3次轻拍,您可以检查是否在2次轻拍后立即触发了1次轻拍识别器。

顺便说一下,虽然我不知道你的应用程序是做什么的,但同时具有三次和两次轻击手势似乎是潜在的可用性问题。仅靠三次轻击本身并不是与应用程序交互的常见方式。我建议至少考虑使用长按代替三次轻击。这将完全避开这个技术挑战 :)


1
有趣的解决方案。我会尝试一下并告诉你结果。至于你提到的第二点,我完全同意。这是客户的要求,即使我们试图反驳,他们仍然非常想要,所以我们必须实施... :( 感谢你提供的可能解决方案! - svguerin3

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接