在UIView和UITableView中冲突的UITapGestureRecognizer
我有一个UIView
其中我加了一个UITapGestureRecognizer
。在这个视图里面我也有一个子视图,其中基本上是某种UITableView
。问题是,为什么UITableView
不能识别连续的水龙头,而是始终一直转到水龙头手势识别器的处理程序。为什么是这样的,我该如何解决这个问题?如果我将抽头数设置为2,那么它工作正常。任何想法如何解决这个问题?基本上它不叫didSelectRowAtIndexPath
。在UIView和UITableView中冲突的UITapGestureRecognizer
将您的识别器的cancelsTouchesInView
设置为NO
。否则,它为自己“消费”触觉,并且不会将它传递给表视图。这就是选择事件从未发生的原因。
如果你想都您UITableView
和你UITapGestureRecognizer
接收触摸事件,然后是该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
方框手势识别接受触摸。
我们不能通过将第3行和第4行更改为:CGRect frame = self.tableView.frame; CGRectContainsPoint(frame,location);'? – Aufwind 2012-11-23 12:43:35
@Aufwind感谢您指出我过于复杂的计算代码。我一定是匆忙回答了这个问题。 'CGRectContainsPoint()'当然是一个更好的方法来处理这个计算,然后我最初选择。不过,我编辑了我的答案,使用'hitTest:withEvent:'。由于几个原因,这将是我的首选方法。其中之一将是一个不规则形状的视图。如果一个视图被呈现为不规则形状(例如,只处理圆圈区域中的触摸的圆圈)。这种情况不会通过我正在执行的手动计算得到妥善处理。再次感谢。 – NJones 2012-11-24 03:54:28
不客气。 :-) – Aufwind 2012-11-24 20:36:57
[将此值设置为'NO'可指示识别器将底层视图的所有触摸传送到底层视图,即使它已识别序列。](http://developer.apple.com/library/IOs/#documentation/ UIKit/Reference/UIGestureRecognizer_Class/Reference/Reference.html) – dasblinkenlight 2012-01-18 02:34:01
示例代码'longPressGestureRecognizer.cancelsTouchesInView = NO;' (谢谢dasblinkenlight) – tmr 2015-01-14 07:21:49
@dasblinkenlight仍然没有为我工作,我无法执行我的表格视图单元格上的触摸事件,我无法从表格视图单元格中选择项目,我已经使用'func tableView(_ tableView:UITableView,didSelectRowAt indexPath:IndexPath)'但项目没有被选择 – 2017-08-27 06:12:21