过滤单击和双击

19
当用户单击我的视图时,我需要运行一个特定的方法。 当用户双击时,我需要另一个方法执行。
问题在于双击会触发单击,这会在我的逻辑中引入错误。 我不能使用UIGestureRecognizer,因为我需要跟踪点。
我尝试了一些布尔值,但没有成功。我还尝试了取消/performSelector-delay技术,但它不起作用(这很奇怪,因为其他论坛上的人说它可以工作,也许模拟器的触摸检测不同?)
我正在尝试让用户设置棋盘上的棋子位置(拖动、旋转),但我需要注意交集、裁剪到棋盘区域等问题,这就是为什么简单的布尔值无法解决问题的原因。
提前致谢!

应该发布你的代码以取消/执行选择器延迟,因为它可以正常工作。 - mackworth
4个回答

45

看起来这个很符合你的需求:

以下是使用UITapGestureRecognizer处理单击和双击的代码。该代码设计为,如果我们获得了双击事件,则不会触发单击事件。诀窍是使用requireGestureRecognizerToFail,要求单击手势在双击事件失败之前等待,然后才触发。因此,当用户点击屏幕时,单击手势识别器将不会触发事件,直到双击手势识别器。如果双击手势识别器识别事件,它将触发双击事件并跳过单击事件,否则它将触发单击事件。

    UITapGestureRecognizer *doubleTapGestureRecognizer = [[UITapGestureRecognizer alloc]
                            initWithTarget:self action:@selector(handleDoubleTap:)];
    doubleTapGestureRecognizer.numberOfTapsRequired = 2;

    //tapGestureRecognizer.delegate = self;
    [self addGestureRecognizer:doubleTapGestureRecognizer];

    //
    UITapGestureRecognizer *singleTapGestureRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleSingleTap:)];
    singleTapGestureRecognizer.numberOfTapsRequired = 1;

    [singleTapGestureRecognizer requireGestureRecognizerToFail: doubleTapGestureRecognizer];
    //tapGestureRecognizer.delegate = self;
    [self addGestureRecognizer:singleTapGestureRecognizer];

可能我不完全理解你所说的“需要跟踪这些点”的确切含义,但我认为使用手势识别器来实现这一点没有任何问题。


非常感谢,这个方法可行,但我发现另一个问题...我有一个CGPoint实例变量,用于跟踪拖动开始点(在touchesBegan中设置)。如果用户将图块拖到不正确的位置(例如在另一个图块的顶部),我会在touchesEnded中将图块位置设置为该起始点。但是,如果用户旋转图块并将其放置在错误的位置,则我的起始点将被触摸点替换,我将无法将图块“重置”到起始点...我对实现这个简单的旋转/放置图块定位感到困惑! - Fernando

7

Swift 3解决方案:

doubleTap = UITapGestureRecognizer(target: self, action:#selector(self.doubleTapAction(_:)))
doubleTap.numberOfTapsRequired = 2


singleTap = UITapGestureRecognizer(target: self, action:#selector(self.singleTapAction(_:)))
singleTap.numberOfTapsRequired = 1

singleTap.require(toFail: doubleTap)

self.view.addGestureRecognizer(doubletap)
self.view.addGestureRecognizer(singleTap)

在代码行singleTap.require(toFail: doubleTap)中,我们强制单击等待并确保触发的事件不是双击。这意味着我们要求确保双击事件失败,因此将其视为单击。

1

Swift解决方案:

    doubleTapSmall1.numberOfTapsRequired = 2
    doubleTapSmall1.addTarget(self, action: "doubleTapPic1")
    smallProfilePic1.addGestureRecognizer(doubleTapSmall1)

    singleTapSmall1.numberOfTapsRequired = 1
    singleTapSmall1.addTarget(self, action: "singleTapPic1")
    singleTapSmall1.requireGestureRecognizerToFail(doubleTapSmall1)
    smallProfilePic1.addGestureRecognizer(singleTapSmall1)

0

通过正确设置委托,实现UIGestureRecognizer委托方法。

 - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch{
            return  YES;
        }

    - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer{
        return YES;
    }

再添加这行代码

[singleTap requireGestureRecognizerToFail:doubleTap];

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