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 に答える