UIButton 触摸事件落入底层视图
Posted
技术标签:
【中文标题】UIButton 触摸事件落入底层视图【英文标题】:UIButton touch event falls through to underlying view 【发布时间】:2011-02-04 20:52:54 【问题描述】:我创建了一个小的UIView
,其中包含两个UIButton
s。视图响应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 子视图接收触摸事件?