处理多个 GestureRecognizers

Handling Multiple GestureRecognizers

我 运行 理解了一个问题 UIGestureRecognizers。我现在的目标是拥有一组 GestureRecognizers 来执行不同的任务,例如:

override func viewDidLoad() {
    mainScene = GameScene(size: self.view.bounds.size)
    main = view as! SKView

    mainScene.panRecognizer = UIPanGestureRecognizer(target: self, action: #selector(shiftView(recognizer:)))
    main.addGestureRecognizer(mainScene.panRecognizer)

    mainScene.tapRecognizer = UITapGestureRecognizer(target: self, action: #selector(testTap(recognizer:)))
    main.addGestureRecognizer(mainScene.tapRecognizer)

    mainScene.pinchRecognizer = UIPinchGestureRecognizer(target: self, action: #selector(zoomView(recognizer:)))
    main.addGestureRecognizer(mainScene.pinchRecognizer)

这是我的游戏视图控制器,我在其中处理诸如平移地图、缩放和点击地图图块等操作。但我也希望能够使用 UITapGestureRecognizer 移动精灵,所以我也在我的 GameScene:

中创建了它
if startGame == true{
            self.startGame()
            for node in (self.tempGameBoard.landShipLayer.children as? Array<landship>)! {

                node.landShipInteraction = UITapGestureRecognizer(target: self, action: #selector(handleTap(recognizer:)))
                parentViewController.view.addGestureRecognizer(node.landShipInteraction)
            }
        }

本例中的 landShip 代表屏幕上的精灵,我想通过手势识别器与之交互。

我的问题是,如果我添加第二组识别器,点击操作将完全没有响应。我仍然可以缩放和平移,但我期望在我的地图图块上的点击行为不会发生。我觉得好像我缺少对手势识别器工作原理的理解。

有什么想法吗?

谢谢!

UIGestureRecognizerDelegate 有一个特殊的功能,可以同时识别同一对象上的多个手势,这就可以了。

1) 将您的 UIViewController 设置为符合 UIGestureRecognizerDelegate

2) 实现以下功能:

func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer) -> Bool {

    if (gestureRecognizer == mainScene.panRecognizer || gestureRecognizer == mainScene.pinchRecognizer) && otherGestureRecognizer == mainScene.tapRecognizer {
        return true
    }
    return false
}

在此特定示例中,我们允许在平移和捏合的同时触发点击手势。

3) 然后将委托分配给平移和捏合手势识别器:

override func viewDidLoad() {
    // your code...

    // Set gesture recognizers delegates
    mainScene.panRecognizer.delegate = self
    mainScene.pinchRecognizer.delegate = self
}