处理多个 GestureRecognizers

Posted

技术标签:

【中文标题】处理多个 GestureRecognizers【英文标题】:Handling Multiple GestureRecognizers 【发布时间】:2017-01-29 06:26:14 【问题描述】:

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

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】:

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

【讨论】:

谢谢!只是为了澄清,在第 2 步中,该功能意味着 panRecognizer and tapRecognizerpinchRecoginzer and tapRecognizer 可以同时发生,对吗?这将与两个 tapRecognizers 以相同的方式工作? @Aleksandr ,这意味着平移不会阻止点击识别并且捏也不会这样做。如果要添加任何其他点击识别器对象,则需要手动将其添加到函数的条件中。您可以在此函数中放置一些日志记录,以便更好地了解它的工作原理。

以上是关于处理多个 GestureRecognizers的主要内容,如果未能解决你的问题,请参考以下文章

在异常处理结构中可以出现多个catch语句和多个finally语句来处理各种异常吗?

网格搜索预处理多个超参数和多个估计器

iOS:使用多个相同的视图控制器处理多个 uilocalnotification

Logstash:多个配置文件(conf)

java中 在一个异常处理中啥语句块是可多个的

如何配置多个异常处理程序