UICollectionView 的 didSelectItemAtIndexPath 仅在用两根手指选择单元格时调用

Posted

技术标签:

【中文标题】UICollectionView 的 didSelectItemAtIndexPath 仅在用两根手指选择单元格时调用【英文标题】:UICollectionView's didSelectItemAtIndexPath only called when selecting cell with two fingers 【发布时间】:2017-04-11 11:04:45 【问题描述】:

我正在使用通过单击手势识别器添加到视图顶部的 UICollectionView。 CollectionView 使用没有任何子视图的自定义单元格。委托的方法

- (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath

仅在用两根手指而不是一根手指选择单元格或用一根手指长按时调用。

我没有意外覆盖

- (void)collectionView:(UICollectionView *)collectionView didDeselectItemAtIndexPath:(NSIndexPath *)indexPath.

我通读了所有类似的问题,这些问题都通过移除某种视图或手势识别器来解决。

有什么想法吗?

【问题讨论】:

我感觉有点水石,你能分享一个简单的项目吗? 请发布您的选择 你试过没有didDeselectItemAtIndexPath 吗? self.collectionView.allowsMultipleSelection = false 试试这个 此链接可能有帮助:***.com/questions/16444688/… 【参考方案1】:

解决方案:将集合视图添加到包含单击手势识别器的视图之上。这在某种程度上是如何导致这种行为的。我从集合视图父视图中删除了识别器,它可以工作。

请随意解释为什么这是预期的行为。我会争辩说,最顶层的视图 (CollectionView) 在将触摸传递给后面的视图之前处理它们。

【讨论】:

+1,这解决了我的问题。我也很好奇为什么集合视图触摸事件在传递给点击手势识别器之前没有得到处理...... 这正是我的问题【参考方案2】:

完全移除手势的另一种方法是设置它,使其不会取消视图中的触摸。

UITapGestureRecognizer* tapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(someSelector)];
tapRecognizer.cancelsTouchesInView = NO;
tapRecognizer.delaysTouchesBegan = NO;
tapRecognizer.delaysTouchesEnded = NO;
[self.view addGestureRecognizer:tapRecognizer];

【讨论】:

【参考方案3】:

基于Christoph解决方案;我想出了这段代码,它正在删除我父视图中的所有手势识别器。

for (UIGestureRecognizer *recognizer in self.view.gestureRecognizers) 
    [self.view removeGestureRecognizer:recognizer];

【讨论】:

以上是关于UICollectionView 的 didSelectItemAtIndexPath 仅在用两根手指选择单元格时调用的主要内容,如果未能解决你的问题,请参考以下文章

如何将数据从集合视图传递到表视图类?

委托不会执行功能

未调用 didSelectCellAtIndexPath

如何滚动另一个 UICollectionView 下方的 UICollectionView?

折叠UICollectionView

将标题添加到 UICollectionView,而不是 UICollectionView 的部分