如果在其背景视图中添加了点击手势识别器,则iOS didSelectItemAtIndexPath不会被调用

时间:2017-07-16 05:08:01

标签: ios objective-c uicollectionview uitapgesturerecognizer

我有一个UIView A,我在A中添加了一个UICollectionView B作为子视图,所以现在视图A是B的背景视图。此时 didSelectItemAtIndexPath 将被正常调用。但是如果我向View A添加了一个轻击手势识别器,那么<​​strong> didSelectItemAtIndexPath 就不会被调用。代码很简单,如下所示

UITapGestureRecognizer *tap2 = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tap2)];
[viewA addGestureRecognizer:tap2];

如何在这种情况下调用 didSelectItemAtIndexPath ?我的预期行为是点击单元格和点击背景方法被正常和单独调用,因为它们具有不同的抽头行为。

1 个答案:

答案 0 :(得分:0)

来自Apple的文档:

  

您应该始终将手势识别器附加到集合视图本身 - 而不是特定的单元格或视图。 UICollectionView类是UIScrollView的后代,因此将手势识别器附加到集合视图不太可能干扰必须跟踪的其他手势。此外,由于集合视图可以访问您的数据源和布局对象,因此您仍然可以访问正确操作单元格和视图所需的所有信息。

https://developer.apple.com/library/content/documentation/WindowsViews/Conceptual/CollectionViewPGforIOS/IncorporatingGestureSupport/IncorporatingGestureSupport.html

我做到了这一点并且效果很好。通常我会在collectionView上调用indexPathForItemAtPoint:来获取indexPath,然后从cellForItemAtIndexPath获取单元格。在您的情况下,您可以检查indexPathForItemAtPoint返回nil(即用户点击单元格之间的区域),然后为此执行代码。您还可以使用UIView convertRect方法确切地确定触摸它的位置。