如何防止tap事件传递给superview?

时间:2011-12-07 15:13:03

标签: iphone ios uigesturerecognizer

有一个名为viewA的UIView,viewA有一个UITapGestureRecognizer,我无法修改识别器的目标代码。
而viewA有很多子视图。对于某些特定的子视图,我希望他们在触摸它们时不会向viewA发送tap事件(对于其他子视图,它们应该向viewA提供tap事件)。我该怎么办?

3 个答案:

答案 0 :(得分:1)

为这些子视图添加另一个UITapGestureRecognizer,因此点击将不会传递给超级视图。

答案 1 :(得分:1)

将viewA设置为识别器的委托。然后使用委托方法:

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch

检查触摸是否在不需要的子视图中:

for(UIView *v in unwantedSubviewsArray){
    CGPoint touchLocation = [touch locationInView:v];
    if (CGRectContainsPoint(v.frame, touchLocation)){
        return NO;
    }
}
return YES;

答案 2 :(得分:0)

您可以拥有一个包含您希望避免对触摸做出反应的视图的数组:

NSArray <UIView *> *untouchableSubviews; //will contain the views you don't want to touch

并覆盖容器视图中的hitTest(在您的情况下为viewA)

- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event{
    UIView *view = [super hitTest:point withEvent:event];
    if ([_untouchableViews containsObject:view]) {
        return nil; //this view will pass touch events to his superview
    }
    else{
        return view; //this view will handle touch events itself
    }
}