UIGestureRecognizer blocks subview for handling touch events UIGestureRecognizer blocks subview for handling touch events ios ios

UIGestureRecognizer blocks subview for handling touch events


I had a very similar problem and found my solution in this SO question. In summary, set yourself as the delegate for your UIGestureRecognizer and then check the targeted view before allowing your recognizer to process the touch. The relevant delegate method is:

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


The blocking of touch events to subviews is the default behaviour. You can change this behaviour:

UITapGestureRecognizer *r = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(agentPickerTapped:)];r.cancelsTouchesInView = NO;[agentPicker addGestureRecognizer:r];


I was displaying a dropdown subview that had its own tableview. As a result, the touch.view would sometimes return classes like UITableViewCell. I had to step through the superclass(es) to ensure it was the subclass I thought it was:

-(BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch{    UIView *view = touch.view;    while (view.class != UIView.class) {        // Check if superclass is of type dropdown        if (view.class == dropDown.class) { // dropDown is an ivar; replace with your own            NSLog(@"Is of type dropdown; returning NO");            return NO;        } else {            view = view.superview;        }    }    return YES;}