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

How to add tap gesture to UICollectionView , while maintaining cell selection?

任务

UICollectionView 添加单击手势,不妨碍单元格 selection。

我想在 collectionView 的无单元格部分进行一些其他点击。

代码

使用 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")
}

结果

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

分析

问题

找不到更多踪迹。关于 cell selection 的实现方式或完成此任务的任何想法?

您可以通过这种方式获取 indexPath and/or 单元格,而不是尝试强制 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")
    }
}

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

我得到另一种方法:添加手势时,设置委托,实现下面的方法

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch

您可以根据自己的需求,根据自己的逻辑,位置或页面隐藏属性决定手势识别器是否接收触摸。