如何在保持单元格选择的同时向UICollectionView添加点击手势?

时间:2016-11-01 18:07:06

标签: ios swift uicollectionview uigesturerecognizer uiresponder

任务

UICollectionView添加单击手势,不要妨碍单元格选择。

我想在collectionView的no-cell部分进行一些其他的点击。

代码

使用XCode8,Swift 3。

override func viewDidLoad() {
    ...
    collectionView.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(tap)))
}

func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
    print(indexPath)
}

func tap(sender: UITapGestureRecognizer){
    print("tapped")
}

结果

是的,它现在阻碍了它。当您点击单元格时,它会记录"点击"。

分析

  • 我检查了collectionView和单元格的hitTest返回值。两者都返回了抽头细胞,这意味着它们形成细胞的响应链 - >的CollectionView
  • 手机上没有手势
  • 关于collectionView的3个手势,似乎没有人使用单元格选择
    • UIScrollViewDelayedTouchesBeganGestureRecognizer
    • UIScrollViewPanGestureRecognizer
    • UITapGestureRecognizer
  • callStack,似乎单元格选择具有不同的堆栈跟踪,具有手势的目标 - 动作模式。
  • 双击手势与单元格选择一起使用。

问题

无法找到更多痕迹。关于如何实施细胞选择或实现这项任务的任何想法?

2 个答案:

答案 0 :(得分:28)

每当您想要添加手势识别器,但不想从目标视图中窃取触摸时,您应该将gestureRecognizer实例的UIGestureRecognizer.cancelsTouchesInView设置为false。

答案 1 :(得分:9)

您可以通过这种方式获取indexPath和/或单元格,而不是尝试强制didSelectItem

func tap(sender: UITapGestureRecognizer){

    if let indexPath = self.collectionView?.indexPathForItem(at: sender.location(in: self.collectionView)) {
        let cell = self.collectionView?.cellForItem(at: indexPath)
        print("you can do something with the cell or index path here")
    } else {
        print("collection view was tapped")
    }
}