title: Gesture recognizer and button actions
body: <p>I have a view hierarchy that looks something like this:</p>
  
  <pre><code>UIView (A)
  UIView &gt; UIImageView
  UIView &gt; UIView (B)
  UIView &gt; UIView (B) &gt; Rounded Rect Button
  UIView &gt; UIView (B) &gt; UIImageView
  UIView &gt; UIView (B) &gt; UILabel
  </code></pre>
  
  <p>I've attached gesture recognizer(s) to my UIView (B). The problem that i'm facing is that i don't get any actions for the Rounded Rect Button which is inside the UIView (B). The singleTap gesture recognizer captures/overrides the button's Touch Up Inside event. </p>
  
  <p>How can i make it work? I thought that the responder chain hierarchy will make sure that the button touch event will be given preference, and it WILL get triggered! What am i missing?</p>
  
  <p>Here's some related code:</p>
  
  <pre><code>#pragma mark -
  #pragma mark View lifecycle (Gesture recognizer setup)
  
  - (void)viewDidLoad {
      [super viewDidLoad];
  
      // double tap gesture recognizer
      UITapGestureRecognizer *dtapGestureRecognize = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(doubleTapGestureRecognizer:)];
      dtapGestureRecognize.delegate = self;
      dtapGestureRecognize.numberOfTapsRequired = 2;
      [self.viewB addGestureRecognizer:dtapGestureRecognize];
  
      // single tap gesture recognizer
      UITapGestureRecognizer *tapGestureRecognize = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(singleTapGestureRecognizer:)];
      tapGestureRecognize.delegate = self;
      tapGestureRecognize.numberOfTapsRequired = 1;
      [tapGestureRecognize requireGestureRecognizerToFail:dtapGestureRecognize];
      [self.viewB addGestureRecognizer:tapGestureRecognize];
  
      // add gesture recodgnizer to the grid view to start the edit mode
      UILongPressGestureRecognizer *pahGestureRecognizer = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(longPressGestureRecognizerStateChanged:)];
      pahGestureRecognizer.delegate = self;
      pahGestureRecognizer.minimumPressDuration = 0.5;
      [self.viewB addGestureRecognizer:pahGestureRecognizer];
  
      [dtapGestureRecognize release];
      [tapGestureRecognize release];
      [pahGestureRecognizer release];
  }
  
  #pragma mark -
  #pragma mark Button actions
  
  - (IBAction)buttonTouchUpInside:(id)sender {
      NSLog(@"%s, %@", __FUNCTION__, sender);
  }
  
  #pragma mark -
  #pragma mark Gesture recognizer actions
  
  
  - (void)singleTapGestureRecognizer:(UIGestureRecognizer *)gestureRecognizer {
      NSLog(@"%s", __FUNCTION__);
  }
  
  - (void)doubleTapGestureRecognizer:(UIGestureRecognizer *)gestureRecognizer {
      NSLog(@"%s", __FUNCTION__);
  }
  
  - (void)longPressGestureRecognizerStateChanged:(UIGestureRecognizer *)gestureRecognizer {
  
      switch (gestureRecognizer.state) {
  
          case UIGestureRecognizerStateEnded: {
              NSLog(@"%s", __FUNCTION__);
  
              break;
          }
          default:
              break;
      }
  }
  </code></pre>