UIButton 触摸事件落入底层视图

Posted

技术标签:

【中文标题】UIButton 触摸事件落入底层视图【英文标题】:UIButton touch event falls through to underlying view 【发布时间】:2011-02-04 20:52:54 【问题描述】:

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

【问题讨论】:

我最终做的是用 UIButtons 换取 UIViews,这些 UIViews 也有一个附加的点击手势识别器。这似乎按我预期的按钮行为方式工作。 【参考方案1】:

您可以修改响应橙色视图中点击手势的方法:

-(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,底层视图将忽略点击。

【讨论】:

【参考方案2】:

正确的答案(防止 tabrecognizer 劫持任何水龙头并且不需要您实现委托等)是found here。我通过this post得到了这个答案。

简而言之:

tapRecognizer.cancelsTouchesInView = NO;

“这可以防止点击识别器成为唯一一个捕捉所有 水龙头”

【讨论】:

【参考方案3】:

视图在视图层次结构中是如何排序的?另外,您是在 IB 中创建接口吗?如果您正确连接连接,这根本不是问题...

【讨论】:

【参考方案4】:

这种设计的问题在于它类似于将一个按钮嵌入另一个按钮。虽然您可能有正当理由这样做,但您应该更加小心事件流。

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

【讨论】:

我想到了这一点,但是响应触摸的视图是底层视图,即使动画(按钮上的蓝色闪烁)显示按钮响应。【参考方案5】:

看看这个问题。

uibutton-inside-a-view-that-has-a-uitapgesturerecognizer

【讨论】:

【参考方案6】:

每个 UIView 都有一个“exclusiveTouch”属性。如果它设置为 YES 视图将不会通过响应者链的触摸。尝试在您的 UIButtons 上设置此属性,看看是否会有所不同。

【讨论】:

以上是关于UIButton 触摸事件落入底层视图的主要内容,如果未能解决你的问题,请参考以下文章

UITapGestureRecognizer 在子视图中阻止 UIButton 的触摸事件

Swift:在自定义视图中未调用 UIButton 触摸事件

为啥 UIView 的这些自动布局约束会阻止 UIButton 子视图接收触摸事件?

如果 UIButton 的位置超出其父视图但它是可见的,它可以响应触摸事件吗?

UIButton 不响应触摸事件

以编程方式将 UIButton 添加到 UINavigationBar 的子视图,并且触摸事件未注册