处理多个手势识别器

9

我遇到了一个理解UIGestureRecognizers的问题。我的目标是拥有一组手势识别器来执行不同的任务,例如:

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代表屏幕上的一个精灵,我希望通过手势识别器与其进行交互。

我的问题是,如果我添加第二组手势识别器,轻击操作将完全无响应。我仍然可以缩放和平移,但我期望在地图瓦片上发生的轻击行为没有发生。我感觉自己缺乏对手势识别器的工作原理的理解。

有任何想法吗?

谢谢!

1个回答

16

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
}

谢谢!只是澄清一下,在第二步中,该函数的意思是panRecognizer和tapRecognizerpinchRecoginzer和tapRecognizer可以同时发生,正确吗?而且,这在两个tapRecognizers上也是同样适用的,对吗? - Aleksandr
@Aleksandr,这意味着平移不会阻止触摸识别,捏合也不会。如果您想添加任何其他的触摸识别对象,您需要手动将其添加到函数的条件中。您可以在此函数内部放置一些日志以更好地理解它的工作原理。 - Vadim Popov

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接