0

Was ist der Unterschied zwischen den .Cancelled und .Failed Zuständen?UIGestureRecognizerState.Cancelled vs UIGestureRecognizerState.Failed

Wie wirkt sich die Einstellung des Gestenerkennungserkenners auf .Cancelled oder .Failed auf den Gestenerkenner selbst aus?

Wann wird der Status einer Gestenerkennung zu .Cancelled und .Failed?

An welchem ​​Punkt wird eine Gestenerkennung als "erkannt" markiert? Nach dem Übergang zu .Began?

Wenn ja, kann der Gestenstatus auch auf .Began in touchesMoved gesetzt werden?

Zum Beispiel in welcher Phase wird eine Quetschgeste von UIPinchGestureRecognizer erkannt? Ich denke nur in touchesMoved weil Pinching eine kontinuierliche Geste ist.

Antwort

1

Tatsächlich gibt es keinen Unterschied zwischen den Status .Cancelled und .Failed. Beides führt dazu, dass die Gestenerkenner die Geste nicht verarbeiten können. Ich denke, es ist nur eine Namenskonvention.

Obwohl, der Unterschied ist auch, wie beide Zustände die Gestenbehandlung beeinflussen.

Es hängt davon ab, was der vorherige Zustand des Gestenerkennung war.

  1. Wenn die Gestenerkenner aus .Possible zu .Began in touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent) (UITouchPhase.Began Phase der Berührung) übergegangen ist, als in dem gleichen Verfahren zu .Failed oder .Cancelled, dem nächsten Gestenerkenner in der Warteschlange (eine Ansicht angebracht) haben die Möglichkeit, mit der Geste umzugehen. Es wird keine Aktionsnachricht gesendet.
  2. Aber wenn die Gestenerkenner von .Possible zu .Began in touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent) (UITouchPhase.Began Phase der Berührung) übergegangen ist, als in der touchesMoved(touches: Set<UITouch>, withEvent event: UIEvent) Methode .Failed oder .Cancelled die Anerkennung Geste einfach fehlschlagen und wird nichts passieren.Aber die Aktionsnachricht wird trotzdem gesendet.
  3. Wenn Sie den Code in Zeile 8 auskommentieren, schlägt die Gestenerkennung fehl, und der nächste Gestenerkenner, der an die Ansicht angehängt ist, hat die Möglichkeit, mit der Geste umzugehen.

Also hier der View-Controller:

class ViewController: UIViewController { 

    func panHandler(sender: UIPanGestureRecognizer) { 
     print("panHandler") 
    } 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     // Do any additional setup after loading the view, typically from a nib. 

     let customRecognizer = CustomGestureRecognizer(target: self, action: #selector(ViewController.customHandler(_:))) 
     view.addGestureRecognizer(customRecognizer) 

     let panRecognizer = UIPanGestureRecognizer(target: self, action: #selector(ViewController.panHandler(_:))) 
     view.addGestureRecognizer(panRecognizer) 

    } 

    override func didReceiveMemoryWarning() { 
     super.didReceiveMemoryWarning() 
     // Dispose of any resources that can be recreated. 
    } 

    func customHandler(c: CustomGestureRecognizer) { 
     print("customHandler") 
    } 
} 

und hier ein benutzerdefinierter Gestenerkenner:

import UIKit 
import UIKit.UIGestureRecognizerSubclass 

class CustomGestureRecognizer: UIGestureRecognizer { 

    override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent) { 
     super.touchesBegan(touches, withEvent: event) 
     state = .Began 
     if touches.count == 1 { 
      //state = .Failed 
     } 
     print("CustomGestureRecognizer.touchesBegan") 
    } 

    override func touchesMoved(touches: Set<UITouch>, withEvent event: UIEvent) { 
     super.touchesMoved(touches, withEvent: event) 

     if state == .Failed { 
      return 
     } 

     if touches.count == 1 { 
      state = .Failed //.Cancelled 
     } 

     state = .Changed 
     print("CustomGestureRecognizer.touchesMoved") 
    } 

    override func touchesEnded(touches: Set<UITouch>, withEvent event: UIEvent) { 
     super.touchesEnded(touches, withEvent: event) 
     state = .Ended 
     print("CustomGestureRecognizer.touchesEnded") 
    } 
} 

Gerade Kommentar/uncomment den Code auf den Leitungen 8, 10 und 23, die Unterschiede zu sehen .

1

Hier sind die Unterschiede zwischen

.Cancelled

Die Gestenerkenner in der Aufhebung einer kontinuierlichen Geste resultierenden berührt erhalten haben. Er sendet seine Aktionsnachricht (oder Nachrichten) beim nächsten Zyklus der Ausführungsschleife und setzt seinen Status auf UIGestureRecognizerStatePossible zurück.

und

.Failed

Die Gestenerkenner hat eine Multi-Touch-Sequenz erhalten, dass es nicht als seine Geste erkennen kann. Es wird keine Aktionsnachricht gesendet und der Gestenerkenner wird auf UIGestureRecognizerStatePossible zurückgesetzt.

Um zu paraphrasieren, wird .Cancelled aufgerufen, wenn eine kontinuierliche Geste unterbrochen wird. .Failed wird aufgerufen, wenn eine Geste nicht als bestimmte Art von Geste erkannt wird.