8

我有一个子视图和一个超级视图。超级视图附加了一个 UITapGestureRecognizer。

UIView *superview = [[UIView alloc] initWithFrame:CGRectMake:(0, 0, 320, 480);
UIView *subview = [[UIView alloc] initWithFrame:CGRectMake:(100, 100, 100, 100);
UIPanGestureRecognizer *recognizer = [[UIPanGestureRecognizer alloc] initWithTarget: self action: @selector(handleTap);
superview.userInteractionEnabled = YES;
subview.userInteractionEnabled = NO;
[superview addGestureRecognizer:recognizer];
[self addSubview:superview];
[superview addSubview:subview];

识别器也在子视图内触发,有没有办法从子视图中排除识别器?



我知道以前有人问过这个问题,但我没有找到一个好的答案。

4

3 回答 3

16

您可以使用手势识别器委托来限制它可以识别触摸的区域,类似于此示例:

recognizer.delegate = self;
...

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch{
    CGPoint touchPoint = [touch locationInView:superview];
    return !CGRectContainsPoint(subview.frame, touchPoint);
}

请注意,您需要保留对父视图和子视图的引用(使它们成为实例变量?)才能在委托方法中使用它们

于 2013-07-05T13:19:02.600 回答
3
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch
{
    if(touch.view == yourSubview)
    {
        return NO;
    }
    else
    {
        return YES;
    }
}

谢谢:https ://stackoverflow.com/a/19603248/552488

于 2014-04-11T09:54:41.740 回答
2

对于 Swift 3,您可以view.contains(point)使用CGRectContainsPoint.

func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldReceive touch: UITouch) -> Bool {
    if yourSubview.frame.contains(touch.location(in: view)) {
        return false
    }
    return true
}
于 2017-10-10T17:52:50.230 回答