Sie können die Implementierung von UIGestureRecognizer
‚s state
Eigenschaft ändern. Wenn Sie state
öffentlich abrufen und festlegen könnten, könnten Sie eine andere berechnete Eigenschaft myState
erstellen, die get weitergeleitet und auf state
gesetzt wird. Leider kannst du nicht. Sie können dies jedoch mit KVO umgehen (Key Value Observing).
Als Erstes erstellen wir ein Objekt, das auf KVO-Benachrichtigungen für unsere Gesten antworten kann und implementiert observeValueForKeyPath
, das aufgerufen wird, wenn die state
-Eigenschaft aufgerufen wird.
class StateObserver : NSObject {
override func observeValueForKeyPath(keyPath: String?, ofObject object: AnyObject?, change: [String : AnyObject]?, context: UnsafeMutablePointer<Void>) {
if let gesture = object as? UIGestureRecognizer {
gesture.stateChanged(gesture.state)
}
}
}
Zweitens registrieren eine StateObserver
Instanz benachrichtigt werden, wenn tap.state
geändert wird.
let stateObserver = StateObserver()
let tap = UITapGestureRecognizer()
tap.addObserver(stateObserver, forKeyPath: "state", options: [.New, .Old], context: nil)
Drittens, vergessen Sie nicht StateObserver
abzumelden, wenn Sie fertig sind.
tap.removeObserver(stateObserver, forKeyPath: "state'")
Wann würden Sie den Beobachter entfernen? Wenn es auf einem UITapGesture zum Beispiel nicht immer gewünscht wird, dass es dort ist, multiple Taps? –
Sie haben Recht damit, dass Sie den Beobachter entfernen, wenn Sie keine Benachrichtigungen mehr erhalten möchten. Ein Beispiel würde den Beobachter hinzufügen, wenn die Ansicht auf dem Bildschirm erscheint, und den Beobachter entfernen, wenn die Ansicht entfernt wird. – Kevin