UIButton触摸事件透传到底层视图

4

我创建了一个小的UIView,其中包含两个UIButton。该视图响应UITapGesture事件。按钮应该响应TouchUpInside,但是当我点击按钮时,响应器是底层视图,并且触发了tap手势选择器。寻求建议或建议。


我最终做的是将UIButtons替换为UIView,这些UIView还附带了一个tap手势识别器。这似乎可以按照我期望的按钮行为工作。 - Kyle
6个回答

4
您可以修改响应橙色视图点击手势的方法:
-(void) handleTapFrom:(UITapGestureRecognizer*) recognizer {
    CGPoint location = [recognizer locationInView:orangeView];
    UIView *hitView = [orangeView hitTest:location withEvent:nil];

    if ([hitView isKindOfClass:[UIButton class]]) {
        return;
    }

    //code that handle orange view tap
    ...
}

如果您触摸了一个UIButton,它的点击事件将被底层视图忽略。


4
正确的答案(可以防止tabrecognizer劫持任何点击,无需实现委托等)在这里找到。我通过此帖子得到了指引。
简而言之,使用:
tapRecognizer.cancelsTouchesInView = NO;

“这可以防止触摸识别器成为唯一捕获所有轻敲的工具。”

1
每个UIView都有一个'exclusiveTouch'属性。如果将其设置为YES,则该视图不会将触摸事件传递给响应者链。尝试在您的UIButtons上设置此属性,看看是否有所不同。

0

视图在视图层次结构中的顺序是如何确定的?另外,您是在IB中创建界面吗?如果您正确地连接了这些连接,这将不会成为任何问题...


0

这种设计的问题在于它类似于将一个按钮嵌入到另一个按钮中。尽管你可能有合理的理由去做,但是你应该更加小心地处理事件流。

发生的情况是手势识别器在触及子视图(即你的两个按钮)之前拦截了它们。你应该实现UIGestureRecognizerDelegate协议,即gestureRecognizer:shouldReceiveTouch:方法,并且如果触摸在任何一个按钮内部,就返回NO。这将防止橙色视图篡夺为按钮而打算的触摸,并使按钮开始按预期工作。


我想到了这个,但是响应触摸的视图是底层视图,即使动画(按钮上的蓝色闪光)显示按钮在响应。 - Kyle


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