2013-07-05 2 views
8

У меня есть подзаголовок и супервизор. У супервизора есть привязанный к нему UITapGestureRecognizer.исключить subview из 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]; 

Распознаватель обжигает внутри подвид, а также, есть ли способ, чтобы исключить распознаватель из подвида?



Я знаю, что этот вопрос задан раньше, но я не нашел для него хорошего ответа.

ответ

13

Вы можете использовать жест распознаватель делегат ограничить область, в которой он может распознавать штрихи, похожие на этот пример:

recognizer.delegate = self; 
... 

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

Заметит, что вам нужно, чтобы сохранить ссылку на родитель и зрения ребенка (сделать их переменный экземпляр?) чтобы иметь возможность использовать их в методе делегата

+0

спасибо, что это сработало! –

1

для 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 
} 
Смежные вопросы