2011-02-04 74 views
2

我创建了一个包含两个UIButton s的小型UIView。该视图响应UITapGesture事件。按钮应该会响应TouchUpInside,但是当我点击按钮时,响应者是底层视图,轻击手势选择器被触发。寻找建议或建议。UIButton触摸事件落入底层视图

+0

我已经结束了什么做的是交易的UIButtons UIViews也有一个附加的轻拍手势识别器。这似乎按照我期望按钮的行为方式工作。 – Kyle 2011-02-07 16:14:06

回答

0

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

+0

这就是我所做的。 – Kyle 2011-02-05 19:30:46

0

每个UIView都有一个'exclusiveTouch'属性。如果它被设置为YES,则该视图不会将响应传递给响应者链。尝试在你的UIButtons上设置这个属性,看看这是否有所作为。

+0

我会给这个镜头。 – Kyle 2011-03-04 15:37:02

0

这个设计的问题是,它类似于将一个按钮嵌入到另一个按钮。虽然您可能有合理的理由去做,但您应该更加注意事件流程。

在手势识别器到达子视图(您的案例中的两个按钮)之前,手势识别器会拦截触摸。您应该实现UIGestureRecognizerDelegate协议,即gestureRecognizer:shouldReceiveTouch:方法,如果触摸位于两个按钮中的任何一个中,则返回NO。这将防止橙色视图篡改旨在用于按钮的触摸,并且按钮将按预期开始工作。

+0

我想到了这一点,但即使动画(按钮上的蓝色闪光)显示按钮响应,对触摸作出响应的视图仍是底层视图。 – Kyle 2011-02-05 19:30:29

3

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

-(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这样,水龙头会由基础视图被忽略。

1

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

总之使用:

tapRecognizer.cancelsTouchesInView = NO; 

“防止水龙头识别要抓住所有的 水龙头只有一个”