2

Ich habe ein Problem mit UIGestureRecognizers kennengelernt. Mein Ziel ist im Moment eine Reihe von GestureRecognizers haben unterschiedliche Aufgaben zu tun, zum Beispiel:Umgang mit mehreren 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) 

Das ist mein Spiel-View-Controller ist, wo ich Aktionen behandeln wie um eine Karte Schwenken, Zoomen und Tippen auf Kartenkacheln . Aber ich mag auch in der Lage sein, Sprites zu bewegen mit einem UITapGestureRecognizer so ich schaffte auch in meinem 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) 
      } 
     } 

Die landShip in diesem Fall ist repräsentativ für einen Sprit auf dem Bildschirm, die ich mit über interagieren möchte Geste Erkenner.

Mein Problem ist, dass, wenn ich diese zweite Gruppe von Erkennern hinzufüge, die Tippaktion vollständig nicht mehr reagiert. Ich kann zwar immer noch zoomen und schwenken, aber das Tippverhalten, das ich auf meinen Kartenkacheln erwarte, kommt nicht vor. Ich habe das Gefühl, dass mir das Verständnis der Gestenerkennung fehlt.

Irgendwelche Ideen?

Danke!

Antwort

3

Die UIGestureRecognizerDelegate hat eine spezielle Funktion, die gleichzeitige Erkennung mehrerer Gesten auf dem gleichen Objekt verwaltet, die den Trick machen wird.

1) Stellen Sie UIViewController anzupassen UIGestureRecognizerDelegate

2) Implementieren Sie die folgende Funktion:

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

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

In diesem speziellen Beispiel wir die Tippgeste ermöglichen, gleichzeitig mit Panning ausgelöst werden und Kneifen.

3) zuweisen Dann einfach die Delegierten in die Pfanne geben und Pinch-Geste Erkenner:

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

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

Dank! Nur um in Schritt 2 zu verdeutlichen, dass diese Funktion bedeutet, dass der 'panRecognizer und tapRecognizer' oder der 'pinchRecoginzer' und der tapRecognizer 'gleichzeitig korrekt sein können? Und das wird mit zwei tapRecognizers genauso funktionieren? – Aleksandr

+0

@Aleksandr, bedeutet dies, dass das Schwenken die Antippen-Erkennung nicht verhindern wird UND die Pinch auch nicht. Wenn Sie ein anderes Objekt zur Erkennung von Tap-Erkennern hinzufügen möchten, müssen Sie es manuell zur Bedingung der Funktion hinzufügen. Sie können eine Protokollierung in diese Funktion einfügen, um besser zu verstehen, wie sie funktioniert. –

Verwandte Themen