Für 2018 ...
Einfacher geht es nicht.
Vergiss das nicht [weak self]
oder du wirst abstürzen.
func animeExample() {
CATransaction.begin()
let a = CABasicAnimation(keyPath: "fillColor")
a.fromValue, duration = ... etc etc
CATransaction.setCompletionBlock{ [weak self] in
self?.animeExample()
self?.ringBell()
print("again...")
}
someLayer.add(a, forKey: nil)
CATransaction.commit()
}
. . . . . HINWEIS - KRITISCHER TIPP >>>>>
Sehr wichtig!
Sie MÜSSEN die Linie setCompletionBlock haben VOR der Linie someLayer.add.
Die Reihenfolge ist kritisch! Es ist eine iOS-Eigenart.
Im Beispiel ruft es sich einfach erneut auf.
Natürlich können Sie jede Funktion aufrufen.
Hinweise für alle, die noch keine Erfahrung mit iOS-Animationen haben:
Der "Schlüssel" (wie in forKey
) ist irrelevant und wird selten verwendet . Setzen Sie es auf Null. Wenn Sie es einstellen möchten, setzen Sie es auf "beliebige Zeichenfolge".
Der "keyPath" ist in der Tat das eigentliche "Ding, das Sie animieren" . Es ist buchstäblich eine Eigenschaft der Ebene wie "Deckkraft", "Hintergrundfarbe" usw., aber als Zeichenfolge geschrieben . (Sie können dort nicht einfach "alles, was Sie wollen" eingeben, es muss der Name einer tatsächlichen Eigenschaft der Ebene sein und es muss animierbar sein.)
Um es zu wiederholen: Der "Schlüssel" (selten verwendet - setzen Sie ihn einfach auf Null) und der "Schlüsselpfad" sind völlig unabhängig voneinander.
Sie sehen oft Beispielcode, in dem diese beiden verwechselt werden (dank der albernen Benennung), was alle möglichen Probleme verursacht.
Beachten Sie, dass Sie alternativ den Delegaten verwenden können, es jedoch viel einfacher ist, nur den Abschlussblock zu verwenden, da (A) er in sich geschlossen ist und überall verwendet werden kann und (B) Sie normalerweise mehr als einen Anime haben. In diesem Fall verwenden Sie den Delegierter ist langweilig.