2012-01-18 88 views
22

我有一个UIView其中我加了一个UITapGestureRecognizer。在这个视图里面我也有一个子视图,其中基本上是某种UITableView。问题是,为什么UITableView不能识别连续的水龙头,而是始终一直转到水龙头手势识别器的处理程序。为什么是这样的,我该如何解决这个问题?如果我将抽头数设置为2,那么它工作正常。任何想法如何解决这个问题?基本上它不叫didSelectRowAtIndexPath在UIView和UITableView中冲突的UITapGestureRecognizer

回答

54

将您的识别器的cancelsTouchesInView设置为NO。否则,它为自己“消费”触觉,并且不会将它传递给表视图。这就是选择事件从未发生的原因。

+4

[将此值设置为'NO'可指示识别器将底层视图的所有触摸传送到底层视图,即使它已识别序列。](http://developer.apple.com/library/IOs/#documentation/ UIKit/Reference/UIGestureRecognizer_Class/Reference/Reference.html) – dasblinkenlight 2012-01-18 02:34:01

+1

示例代码'longPressGestureRecognizer.cancelsTouchesInView = NO;' (谢谢dasblinkenlight) – tmr 2015-01-14 07:21:49

+0

@dasblinkenlight仍然没有为我工作,我无法执行我的表格视图单元格上的触摸事件,我无法从表格视图单元格中选择项目,我已经使用'func tableView(_ tableView:UITableView,didSelectRowAt indexPath:IndexPath)'但项目没有被选择 – 2017-08-27 06:12:21

26

如果你想UITableViewUITapGestureRecognizer接收触摸事件,然后是该cancelsTouchesInView = NO会工作。如果你想让轻击手势识别器不接收用于表格视图的触摸事件,那么它稍微不容易,但非常可行。

基本上,当您创建您的手势识别器时,您将自己设置为其代表。然后执行gestureRecognizer:shouldReceiveTouch:委托方法。基本的实现可能看起来像这样。

-(BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch{ 
    UITableView *tableView = self.tableView; 
    CGPoint touchPoint = [touch locationInView:tableView]; 
    return ![tableView hitTest:touchPoint withEvent:nil]; 
} 

本质上讲,这方法(如实施)询问tableView如果该触摸的位置的tableView的管辖范围内下降,并且如果这样做,它会接收来自所述触摸...允许tableView方框手势识别接受触摸。

+1

我们不能通过将第3行和第4行更改为:CGRect frame = self.tableView.frame; CGRectContainsPoint(frame,location);'? – Aufwind 2012-11-23 12:43:35

+0

@Aufwind感谢您指出我过于复杂的计算代码。我一定是匆忙回答了这个问题。 'CGRectContainsPoint()'当然是一个更好的方法来处理这个计算,然后我最初选择。不过,我编辑了我的答案,使用'hitTest:withEvent:'。由于几个原因,这将是我的首选方法。其中之一将是一个不规则形状的视图。如果一个视图被呈现为不规则形状(例如,只处理圆圈区域中的触摸的圆圈)。这种情况不会通过我正在执行的手动计算得到妥善处理。再次感谢。 – NJones 2012-11-24 03:54:28

+0

不客气。 :-) – Aufwind 2012-11-24 20:36:57

相关问题