2016-03-30 15 views

Antwort

1

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'") 
+0

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? –

+0

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

Verwandte Themen