在多个视图中处理 UIGestureRecognizer

Handle UIGestureRecognizer in multiple views

我有一个添加了 UITapGestureRecognizer 的 UIView。我添加了一个 UICollectionView 作为子视图。问题是 UICollectionView 使用 UITapGestureRecognizers 来捕获对集合视图单元格的点击,而父 UIView 会捕获它们。有没有办法传递这些识别器,以便它们由 UIViewUICollectionView 处理?

** 编辑 - 添加代码示例 **

let mainView = UIView()
let tapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(foo))
mainView.addGestureRecognizer(tapGestureRecognizer)

let collectionView = UICollectionView(/*...*/)
collectionView.delegate = self
mainView.addSubview(collectionView)

func foo(_ gestureRecognizer: UIGestureRecognizer) {
    // Will be called when I tap on mainView
}

func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
    // Will NOT be called when I tap on collectionView's cells
}

谢谢。

您可以通过 UIGestureRecognizerDelegate 实现。将委托分配给您的手势并使用下面的扩展名。下面的 Delegate 允许手势仅在从 collectionView.

外部触摸时接收触摸
extension SharePathViewController: UIGestureRecognizerDelegate {
    func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldReceive touch: UITouch) -> Bool {
        let point = touch.location(in: view)
        return !collectionView.frame.contains(point)
    }
}

如果您希望在单元格中点击时调用手势函数,则只需在选中单元格时调用该函数即可。