2

私は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は、私はジェスチャー経由と対話したい画面上のスプライトの代表であります認識装置。

私の問題は、この2番目の認識器セットを追加すると、タップ動作が完全に反応しなくなるということです。私はまだズームとパンができますが、マップタイルで期待しているタップ動作は発生しません。ジェスチャー認識プログラムの仕組みを理解していないように感じます。

アイデア?

ありがとうございます!

答えて

3

UIGestureRecognizerDelegateには、同じオブジェクトに複数のジェスチャーを同時に認識させる特殊な機能があります。これはそのトリックを行います。私たちは、タップジェスチャがパンとピンチと同時にトリガーを取得することができ、この特定の例では

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

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

1)は、以下の機能を実装)UIGestureRecognizerDelegate

2を準拠するように、あなたのUIViewControllerを設定します。

3)それからちょうどパンとピンチジェスチャー認識装置にデリゲートを割り当てます。

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

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

感謝を!ステップ2で明確にするために、その関数は 'panRecognizerとtapRecognizer'または' pinchRecoginzerとtapRecognizer'が同時に起こることを意味していますか?これは2つのtapRecognizersで同じように動作しますか? – Aleksandr

+0

@Aleksandr、これは、パンニングがタップ認識を妨げず、ピンチでもそれをしないことを意味します。他のタップレコグナイザオブジェクトを追加する場合は、それを手動で関数の条件に追加する必要があります。どのように動作するかをよりよく理解するために、この関数の中にいくつかのロギングを配置することができます。 –

関連する問題