2016-12-24 5 views
0

Ich habe eine Basisklasse, die einige grundlegende Animationen der Zelle behandelt. In meiner Unterklasse habe ich das Erkennungsziel außer Kraft gesetzt und möchte etwas anderes tun, aber die Übersetzung lautet immer 0, da ich in der Basisklasse die Übersetzung anrufe, die auf .zero zurückgesetzt wird.Override Ziel von UIPanGestureRecognizer

Gibt es eine Möglichkeit, meine Basisklasse für die grundlegende Animation zu verwenden und eine Unterklasse zu verwenden, um die Methode zu überschreiben und einige andere Dinge zu tun, wie unten gezeigt?

Ich habe eine Basisklasse:

class Base: UITableViewCell { 

    override init(style: UITableViewCellStyle, reuseIdentifier: String?) { 
     super.init(style: style, reuseIdentifier: reuseIdentifier) 

     let gesture = UIPanGestureRecognizer(target: self, action: #selector(handlePan)) 
     addGestureRecognizer(gesture) 
    } 

    func handlePan(recognizer: UIPanGestureRecognizer) { 
     if recognizer.state == .changed { 
      let translation = recognizer.translation(in: self) 

      ... 

      recognizer.setTranslation(.zero, in: self) 
     } 
    } 
} 

Und meine Unterklasse:

class Sub: Base { 

    override func handlePan(recognizer: UIPanGestureRecognizer) { 
     super.handlePan(recognizer: recognizer) 

     if recognizer.state == .changed { 
      let translation = recognizer.translation(in: self) 

      print(translation.x) // is always 0 

      recognizer.setTranslation(.zero, in: self) 
     } 
    } 
} 

Antwort

0

In der Basisklasse könnte man die gemeinsame Funktionalität in eine andere Funktion aufzuschlüsseln? Auf diese Weise können nicht brauchen würde super.handlePan zu nennen:

class Base: UITableViewCell { 
    override init(style: UITableViewCellStyle, reuseIdentifier: String?) { 
     super.init(style: style, reuseIdentifier: reuseIdentifier) 
     let gesture = UIPanGestureRecognizer(target: self, action: #selector(handlePan)) 
     addGestureRecognizer(gesture) 
    } 

    func handlePan(recognizer: UIPanGestureRecognizer) { 
     if recognizer.state == .changed { 
      let translation = recognizer.translation(in: self) 
      performBaseAnimation(recognizer) 
      recognizer.setTranslation(.zero, in: self) 
     } 
    } 
    func performBaseAnimation(_ recognizer: UIPanGestureRecognizer) { 
     // perform common actions here 
    } 
} 
class Sub: Base { 
    override func handlePan(recognizer: UIPanGestureRecognizer) { 
     super.handleBaseAnimation(recognizer) 
     if recognizer.state == .changed { 
      // perform subclass actions here 
     } 
    } 
} 
+0

Das Problem ist immer noch die gleiche sein würde, die Basisklasse mit Aufruf 'recognizer.setTranslation (.zero, in: Selbst-)', die die Unterklasse verhindert, benutze 'recognizer.translation (in:)'. –

+0

In meinem Beispiel, da Sie Dinge in der Unterklasse überschrieben haben, wird die Superview ** let ** nicht von der Unterklasse, nur die Superansicht aufgerufen. Es ist nirgends in dem "Super" -Aufruf von der Unterklasse zu finden. – dfd

+0

Sie haben Recht. Ich habe es gerade getestet und es funktioniert. Vielen Dank! –

Verwandte Themen