Exclude subviews from UIGestureRecognizer Exclude subviews from UIGestureRecognizer xcode xcode

Exclude subviews from UIGestureRecognizer


I used the simple way below. It works perpectly!

Implement UIGestureRecognizerDelegate function, accept only touchs on superview, not accept touchs on subviews:

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch{    if (touch.view != _mySuperView) { // accept only touchs on superview, not accept touchs on subviews        return NO;    }    return YES;}


iOS 6 introduces a great new feature that solves this exact problem - a UIView (subview) can return NO from gestureRecognizerShouldBegin: (gesture recognizer attached to a superview). Indeed, that is the default for some UIView subclasses with regard to some gesture recognizers already (e.g. a UIButton with regard to a UITapGestureRecognizer attached to a superview).

See my book on this topic: http://www.apeth.com/iOSBook/ch18.html#_gesture_recognizers


I managed to get it working by doing the following:

UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapGestureHandler:)];// ...-(void) tapGestureHandler:(UITapGestureRecognizer *)sender {    CGPoint point = [sender locationInView:sender.view];    UIView *viewTouched = [sender.view hitTest:point withEvent:nil];    if ([viewTouched isKindOfClass:[ThingIDontWantTouched class]]) {        // Do nothing;    } else {        // respond to touch action    }}