在多个视图中处理UIGestureRecognizer

时间:2019-06-05 10:22:03

标签: ios swift uicollectionview uigesturerecognizer

我有一个向其中添加了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
}

谢谢。

1 个答案:

答案 0 :(得分:1)

您可以从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)
    }
}

如果您希望在点击单元格时调用手势功能,然后在选定单元格时简单地调用该功能。