如何忽略UIGestureRecognizer的触摸?

6
我正在使用UIGestureRecognizer来捕获轻拍操作……如果我不想处理特定的轻拍操作,手册上说:

“如果手势识别器检测到一个它确定不属于其手势的触摸,则可以直接将该触摸传递给其视图。为此,手势识别器在自身上调用ignoreTouch:forEvent:,并传入触摸对象。”

不幸的是,我找不到任何使用示例。这是我的UIGestureRecognizer处理程序代码:

- (void)singleFingerTap:(UITapGestureRecognizer*)gesture {

    CGPoint pt = [gesture locationInView:self.view];
    CGRect dataRect = CGRectMake(117.0,416.0,670.0,1450);
    CGPoint dataPoint = CGPointMake(pt.x, pt.y);

    //  check to see if point is within the rectangle
    if(!CGRectContainsPoint(dataRect, dataPoint))  {
        NSLog(@"\n\nNOT within subViewData (x: %f  y: %f",dataPoint.x, dataPoint.y);
        [self.view ignoreTouch:gesture];
    }
    else  {
        NSLog(@"\n\nIS within subViewData(x: %f  y: %f",dataPoint.x, dataPoint.y);
    }
}

我一直遇到一个错误:

UIView没有声明 'ignoreTouch:' 选择器的可见接口

我已经阅读了App文档,它们有我引用的内容;在SO或Google上没有回答这个问题的信息。非常感谢帮助(像往常一样):D


你引用了文档中说“在手势识别器上调用ignoreTouch:****forEvent:*****”,然后你想知道在一个视图上调用ignoreTouch:为什么不起作用?你期望发生什么?你有很多问题,只要读一下错误信息和查看你的代码,就可以回答这些问题。 - jscs
2个回答

9

如果您想完全防止识别器接收触摸事件,UIGestureRecognizerDelegate提供了一个可以使用的方法:gestureRecognizer:shouldReceiveTouch:

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch {
    if (/* some logic here*/) {
        return NO;
    }

    return YES;
}

如果您有多个识别器在使用中,您应该在执行测试逻辑之前检查gestureRecognizer是否是您的点击识别器。
如果您必须处理所有触摸事件,那么看起来您需要同时调用ignoreTouch:forEvent:并传入两个参数。
    [recognizer ignoreTouch:someTouch withEvent:someEvent];

这个方法似乎只适用于UIGestureRecognizer的子类使用,因此我建议创建一个UITapGestureRecognizer的子类来实现您自己的自定义逻辑以确定点击的有效性。


Jacky Boy:这不是我在上面的代码中有吗? - SpokaneDude
1
他正在向一个UIView发送ignoreTouch:forEvent:,并且参数错误。 - Rui Peres
我会保留我的-1,因为你在领导斯波坎很糟糕...小心...第一个参数是UITouch而不是“某些手势”... - Rui Peres
@JackyBoy:根据文档:...手势识别器会在自身上调用ignoreTouch:forEvent:方法,并传入触摸对象。"。因此,鉴于我上面的代码(即手势识别器),"ignoreTouch"应该是什么? - SpokaneDude
那么,我应该怎么做呢?我在我的手势识别器中,想要正确地忽略一个触摸...根据文档...那么我应该怎么做呢? - SpokaneDude
显示剩余6条评论

1

你说的进程是什么意思?触摸在那里,你要做什么,取决于你。如果你不想对它做任何事情,就不做,否则就做点什么。想要忽略的想法取决于你的逻辑...

我对这个问题感到困惑,但是无论如何,要么你用错误的术语提出了问题,要么你想要其他东西: UIGestureRecognizer blocks subview for handling touch events

Edit1:

我的意思是我想忽略此次轻拍,因为它是为另一个UIView而设计的

那么你是把轻拍手势添加到了错误的 UIView 上。


“进程”指的是我想忽略这个点击,因为它是针对另一个UIView的。然而,现在发生的情况是一旦我处理了任何一个点击,正常流程中的其他方法就不会被执行。我尝试了一个简单的“return”语句,但仍然没有执行其他操作。 - SpokaneDude

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