UITapGestureRecognizer - 检测双重或三重敲击?

时间:2013-12-30 21:07:14

标签: ios iphone objective-c uitapgesturerecognizer

我有一个案例,需要通过双击和特定视图的三击来完成两种完全不同的行为。我的设置非常标准,代码如下:

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

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

显然,这不是代码或底层SDK的固有问题,因为它是完全可以预期的。但是,我很好奇是否有人聪明地以某种方式阻止双击功能被调用如果完成三击?我假设我可能不得不在延迟计时器上设置双击功能(这将等待一瞬间确认是否完成了三次点击),但我不确定是否有更好的方法,甚至以干净的方式设置这种东西的最好方法是什么?

提前感谢您提出的任何建议!

2 个答案:

答案 0 :(得分:8)

您可以使用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有一些额外的信息,并提到这个场景是使用这种方法的好时机。

答案 1 :(得分:1)

如何创建2个识别器,分别为1和2个抽头(通过numberOfTapsRequired配置它们)。这显然会照顾到1和2个水龙头。要检测3次点击,您可以检查1次点击识别器是否在2次点按后立即被点击。


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