手势识别器,如何区分单击和双击。

3

我正在给一个视图添加两个手势识别器,代码如下。我的目的是:如果用户单击一次,发生一件事情。如果他们双击,会发生另一件事情。

目前情况是,当用户单击或双击时都会触发单击操作。换句话说,当我双击时,我得到了两个动作,而不是我想要的一个动作。

区分

//gesture recognizer.
UITapGestureRecognizer *tapRecognizerShowHideMenu = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(doOneThing)];
[tapRecognizerShowHideMenu setDelegate:self];
[tapRecognizerShowHideMenu setNumberOfTapsRequired:1];
[self.view addGestureRecognizer:tapRecognizerShowHideMenu];

UITapGestureRecognizer *tapRecognizerEditEffect = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(doAnotherThing)];
[tapRecognizerEditEffect setDelegate:self];
[tapRecognizerEditEffect setNumberOfTapsRequired:2];
[self.view addGestureRecognizer:tapRecognizerEditEffect];
4个回答

16

将此代码添加到您的代码中:

[tapRecognizerShowHideMenu requireGestureRecognizerToFail:tapRecognizerEditEffect];

当你为手势识别器设置requireGestureRecognizerToFail时,你是在说只有在另一个手势识别器没有识别的情况下它才应该识别该手势。因此,在这里,你告诉单次轻拍手势仅在双击手势未被识别时才被识别。


但在这种情况下,我认为我们应该更改参数。 - Dmitry Zheshinsky
也许是这样的,但是如果应用程序直观且易于使用,同时具有这两种手势识别器也没有问题。这取决于提问者的应用程序功能。 - Anton
那肯定可以,谢谢。奇怪的是它引入了一个非常明显的延迟(大约0.25秒)。 - OWolf
1
这是双击手势识别器失败所需的时间。它会等待一段时间来看第二次点击是否到来。 - Anton
这里有一种不需要暂停的实现点击和双击的方法,它比较高级并且不使用手势识别器:https://dev59.com/rmsz5IYBdhLWcg3wNVAR - Anton

1

1

这个看起来相当不错,是从Anton在上面的评论中提供的链接进行修改的。

如何在瞬间识别单击/双击?

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event{
    UITouch *touch = [touches anyObject];
    if (touch.tapCount == 1) {

        [self performSelector:@selector(showHideMenu) withObject:nil afterDelay:0.15];

    } else if (touch.tapCount == 2) {

        [self performSelector:@selector(editEffect) withObject:nil afterDelay:0];
    }
}

0
也许使用长按手势识别器而非双击手势识别器会更有用。这样就不会出现冲突了。

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