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

Posted

技术标签:

【中文标题】如果将点击手势识别器添加到其背景视图中,则不会调用 iOS didSelectItemAtIndexPath【英文标题】:iOS didSelectItemAtIndexPath doesn't get called if a tap gesture recognizer is added to its background view 【发布时间】:2017-07-16 05:08:00 【问题描述】:

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

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

我怎样才能让 didSelectItemAtIndexPath 在这种情况下被调用?我的预期行为是点击单元格和点击背景方法都被正常且单独调用,因为它们具有不同的点击行为。

【问题讨论】:

是一个奇怪的问题,经过测试,对我来说最好的解决方法似乎是使用按钮,按钮可以完美地工作 【参考方案1】:

来自 Apple 的文档:

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

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

我已经这样做了,而且效果很好。通常我会在collectionView 上调用indexPathForItemAtPoint: 来获取indexPath,然后从cellForItemAtIndexPath 获取单元格。在您的情况下,您可以检查 indexPathForItemAtPoint 返回 nil (即用户单击单元格之间的区域),然后为此执行代码。你也可以使用UIViewconvertRect 方法来弄清楚它到底是在哪里触摸的。

【讨论】:

以上是关于如果将点击手势识别器添加到其背景视图中,则不会调用 iOS didSelectItemAtIndexPath的主要内容,如果未能解决你的问题,请参考以下文章

如何使用点击事件使其不会传播到视图

将点击手势添加到任何视图都不会触发

手势识别器阻止触摸已结束

将手势识别器添加到表格单元格中的图像视图

iPhone UIView touchesMoved: withEvent: 不会在 UIView 上使用手势识别器调用

点击手势识别器不会触发