UITapGestureRecognizer on UILabels in subview of UIScrollView not working

ios, objective-c, uigesturerecognizer, uilabel, uiscrollview

Solution

The scroll view also has a gesture recogniser. By default, only 1 gesture recognizer can be handling touches at any one time. You need to make yourself the delegate of your gesture and then implement `gestureRecognizer:shouldRecognizeSimultaneouslyWithGestureRecognizer:` to return `YES`. This will allow it to work at the same time as the scroll view.

Problem

I have a problem where my UITapGestureRecognizer on my UILabels in a content view in my UIScrollView is not calling it's methods. The view hierarchy is as follows: - scrollView (UIScrollView) - contentView (UIView) - testLabel (UILabel) - here is where the UITapGestureRecognizer is attached I have distilled the code down to an example to highlight the problem ``` // Set scrollview size - Added in Storyboad [scrollView setContentSize:CGSizeMake([arrayOfVerbs count]*self.view.frame.size.width, scrollView.contentSize.height)]; [scrollView setCanCancelContentTouches:YES]; // Tried both yes and no [scrollView setPagingEnabled:YES]; // Add content view UIView *contentView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, scrollView.contentSize.width, scrollView.contentSize.height)]; [scrollView addSubview:contentView]; // Add test UILabel UILabel *testLabel = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 200, 100)]; [testLabel setBackgroundColor:[UIColor redColor]]; [testLabel setText:@"Test touch"]; [testLabel setUserInteractionEnabled:YES]; [contentView addSubview:testLabel]; // Add gesture recogniser UITapGestureRecognizer *singleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(playSound:)]; singleTap.numberOfTapsRequired = 1; [testLabel addGestureRecognizer:singleTap]; ``` And this is the method that the tap gesture recogniser should call ``` - (void)playSound:(UITapGestureRecognizer *)sender { NSLog(@"play sound"); if(sender.state == UIGestureRecognizerStateEnded) { int pronounNumber = [sender.view tag]; int exampleNumber = (int)sender.view.frame.origin.x%(int)self.view.frame.size.width; NSLog(@"Pronoun is %i and example is %i", pronounNumber, exampleNumber); } } ``` This method is never called when I tried to touch on the UILabel. I have tried setting the property canCancelContentTouches to both YES and NO on the scroll view as suggested by this thread, but it's still not working. The strange thing is, if I add a UILabel outside of the scrollView, then the gesture recogniser works! So the problem only occurs in my contentView which is a subview of my scrollView. I am using auto-layout, if that might be any difference? Thanks!

Original source