2017-03-10 19 views
2

シングルタップとダブルタップの両方を実装しました。しかし、画面をダブルタップするたびに、シングルタップコードも実行されます。下記のコードをご覧ください:ダブルタップがtouchesで発生したときにシングルタップが呼び出されないようにする方法

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) { 
    let touch = touches.first as UITouch! 
    let touchLocation = touch?.location(in: self) 
    let touchedNode = self.atPoint(touchLocation!) 

if touch?.tapCount == 1 { 
     print("single tap") 
     if let name = touchedNode.name  { 
      if name == "enemySprite" 
      { 
       //handle single Tap 
      } 
     } 
    } 

if touch?.tapCount == 2 { 
     print("double tap") 
     if let name = touchedNode.name  { 
      if name == "enemySprite" 
      { 
       //handle double Tap 
      } 
     } 
    } 
} 

タップカウントを相互排他的にするにはどうすればよいですか? Apurvの答えと旋風さんのコメントに基づいて

UPDATE

私は、次のコードショーの仕事を考えました。それが機能しないと、私はエラーが

Value of type ’SKView?’ has no member ‘sampleTapGestureTapped(recognizerMethod:)’ and 
Value of type ’SKView?’ has no member ‘sampleTapGestureTapped(recognizerMethod2:)’ 

は、タップジェスチャー変数の宣言も

を指して、言ってもらう

override func didMove(to view: SKView) { 

    var tapGesture = UITapGestureRecognizer(target: self, action: #selector(self.view.sampleTapGestureTapped(recognizerMethod:))) 
    self.view.addGestureRecognizer(tapGesture!) 
    tapGesture.numberOfTapsRequired = 1; 

    var tapGestureDouble = UITapGestureRecognizer(target: self, action: #selector(self.view.sampleTapGestureTapped(recognizerMethod2:))) 
    self.view.addGestureRecognizer(tapGestureDouble!) 
    tapGestureDouble.numberOfTapsRequired = 2; 

    [tapGesture requireGestureRecognizerToFail : tapGestureDouble]; 

} 

、私はエラー

Expected expression in the container literal 
を取得します

は、上記の方法の最後の行を指しています。

私はここに何か不足していると思いますが、これについていくつかの助けと説明をいただきたいと思います。

+0

問題は、iOSのは、それを見て、あなただけのちょうどあなたと同じように:-)一度か二度画面をタッチしているシングルまたは画面をダブルタップしていないということです最初のタッチがあったのを見てスワイプを検出するためにtouchesBeganを使用していないタッチの動きおよび方向を監視する。 (私は、iOSの初期にはタップ、スワイプ、ピンチ、回転などのためにやらなければならないことはまさに悪夢だと思うが) –

答えて

3

あなたはこのように、あなたのシーン内のタップを処理することができます...必然のViewControllerにアクセスする必要はありませんあなたのコメントに基づいて、現在のシーンの中のタップを処理することが、あなたが達成したいと思うものだと私は思っています。

EDIT:

あなたのコメントからの質問に答えるために...あなたはは、ビューでタッチ位置を見つけるシーン内の場所に変換し、掴んでをタッチするノードをつかむことができますその場所にあるノード:

func singleTapHandler(recognizer:UITapGestureRecognizer){ 

     print("Single tap detected") 

     let locationInView = recognizer.location(in: self.view) 

     let locationInScene = self.convertPoint(fromView: locationInView) 

     print(locationInScene) 

     let node = atPoint(locationInScene) 

     if let nodeName = node.name { 
      //do stuff 
     } 

     //or 

     if let sprite = node as? SKSpriteNode { 
      // node is an SKSpriteNode 
     } 
    } 
+0

ありがとうございます。今の問題は、どのスプライトがタップされたかをどのように判断するのかです。上記の私の質問では、SKNodeのnameプロパティを使用して、タッチされた正確なスプライトを判断していました。どのようにUITapGestureRecognizer内でそれを行うことができますか? – ItsMeAgain

+0

@ItsMeAgain自分の編集をチェックアウトします。また、現在の質問のタイトルと異なる質問がある場合は、新しい質問をする必要があります。 – Whirlwind

+0

@ItsMeAgainまた、このメソッド(nodesAtPoint)について知っておくと便利です:https://developer.apple.com/reference/spritekit/sknode/1483072-nodesatpoint – Whirlwind

3

タップを処理するより良い方法は、ジェスチャ認識機能を使用することです。 UITapGestureRecognizerを使用して、トラッキングするタップの適切な数を設定します。

これで、両方のタップをシームレスに動作させ、ダブルタップが失敗した場合にのみ、単一のジェスチャが呼び出されるようにすることができます。以下のコードを参照してください。

ViewController上のいくつかのメソッドを呼び出すもちろん
import SpriteKit 

class GameScene: SKScene { 

    var recognizers:[UIGestureRecognizer] = [] 

    override func didMove(to view: SKView) { 

     // Get label node from scene and store it for use later 


     let single = UITapGestureRecognizer(target: self, action: #selector(GameScene.singleTapHandler(recognizer:))) 
     view.addGestureRecognizer(single) 
     single.numberOfTapsRequired = 1 
     recognizers.append(single) 

     let double = UITapGestureRecognizer(target: self, action: #selector(GameScene.doubleTapHandler(recognizer:))) 
     view.addGestureRecognizer(double) 
     double.numberOfTapsRequired = 2 
     recognizers.append(double) 

     single.require(toFail: double) 

    } 

    override func willMove(from view: SKView) { 
     super.willMove(from: view) 

     for recognizer in recognizers { 
      self.view?.removeGestureRecognizer(recognizer) 
     } 
     recognizers.removeAll() 
    } 

    func singleTapHandler(recognizer:UITapGestureRecognizer){ 

     print("Single tap detected") 
    } 

    func doubleTapHandler(recognizer:UITapGestureRecognizer){ 
     print("Double tap detected") 
    } 

} 

は少数で行うことができます

var tapGesture = UITapGestureRecognizer(target: self, action: #selector(ViewController.sampleTapGestureTapped(recognizerMethod:))) 
    self.view.addGestureRecognizer(tapGesture!) 
tapGesture.numberOfTapsRequired = 1; 

var tapGestureDouble = UITapGestureRecognizer(target: self, action: #selector(ViewController.sampleTapGestureTapped(recognizerMethod2:))) 
    self.view.addGestureRecognizer(tapGestureDouble!) 
tapGestureDouble.numberOfTapsRequired = 2; 

[tapGesture requireGestureRecognizerToFail:tapGestureDouble]; 
+0

これはSpriteKitの 'SKScene'でこれをどのように使用するか分からないのですが、これはビューコントローラにアクセスする必要があるからです。 – ItsMeAgain

+0

@ItsMeAgain SKSceneにはSKViewへの参照があります。 Apurvが言ったように、 'self.view ...'は動作する( 'self'はシーンです)。 – Whirlwind

+0

@Whirlwind質問を更新しました – ItsMeAgain

関連する問題