UIScrollView的iOS5 UITapRecognizer干扰button。 怎么修?

我有UIScrollView UIView内的一堆UIButton 。 我正在试图添加一个水龙头识别器的滚动视图。 轻拍识别器触发,但现在我的button没有任何工作。

我知道,在iOS5中, UIScrollView可以以某种方式将触摸事件传递给控制层次。 任何人都可以帮我弄清楚如何做到这一点?

UIGestureRecognizer属性cancelsTouchesInView设置为NO。

 UITapGestureRecognizer *singleTapGestureRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(singleTap:)]; singleTapGestureRecognizer.numberOfTapsRequired = 1; singleTapGestureRecognizer.enabled = YES; singleTapGestureRecognizer.cancelsTouchesInView = NO; [tapableView addGestureRecognizer:singleTapGestureRecognizer]; [singleTapGestureRecognizer release]; 

来自UIGestureRecognizer类参考

一个布尔值,影响识别手势时是否将触摸传递给视图。

当此属性为YES(默认值)并且接收方识别其手势时,该待处理手势的触摸将不会传送到视图,而先前传送的触摸将通过touchesCancelled:withEvent:消息发送到视图来取消。 如果手势识别器不识别其手势,或者如果此属性的值为NO,则视图接收多点触摸序列中的所有触摸。

对于我来说,上述答案的组合工作

 UITapGestureRecognizer *tapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(userDidTap:)]; tapRecognizer.cancelsTouchesInView = YES; tapRecognizer.delegate = self; [tapRecognizer requireGestureRecognizersToFail:self.scrollView.gestureRecognizers]; [self.view addGestureRecognizer:tapRecognizer]; 

 - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch { if ([touch.view.superview isKindOfClass:[UIButton class]] || [touch.view isKindOfClass:[UIButton class]]) { return NO; } return YES; } 

您也可以使用此处logging的UIGestureRecognizerDelegategestureRecognizer:shouldReceiveTouch:方法完成相同的操作。 它提供了更多的灵活性,例如,如果你想取消某些触摸,而不是其他的。 这是一个例子,

 - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch { if ([touch.view.superview isKindOfClass:[UIButton class]]) return NO; return YES; }