2017-11-28 5 views
2

Ich bin verwirrt, warum die keyPath ist eine Zeichenfolge beim Animieren einer bestimmten Eigenschaft auf einem CALayer. Wäre es nicht besser und sicherer, nur ein Enum zu verwenden? Ich wundere mich nur über den Vorteil der Eingabe eines String-Literals.Warum nehmen Core-Animationstypen einen String Key Path?

Beispiel: let flash = CASpringAnimation(keyPath: "borderColor")

Antwort

4

Core Animation wurde in Objective-C geschrieben und Objective C nicht über rasche Aufzählungen, wenn Sie Reflexion, wie in Swift Kodierbare und CodingKeys denken.

Core Animation verwendet auch KVO, um Änderungen an den Eigenschaften Ihrer Ebene zu erkennen und zu animieren. Dies ermöglicht implizite Animationen. Deshalb können die UIView.Animation-Methoden Ihre Ansichten animieren, wenn Sie Änderungen in ihrem Block vornehmen, ohne dass Sie explizit etwas animieren. Sie ändern den Wert der Eigenschaft und das Animationssystem beobachtet diese Änderung durch KVO und erzeugt die entsprechende Animation für Sie.

+0

Große knappe Antwort, die es deutlich erklärt. Danke –

+0

Große Antwort. Können Sie einige gute Ressourcen für Core Animation vorschlagen? – TheoK

5

Während Josh Homanns Antwort sehr hilfreich ist, ist es auch erwähnenswert, dass es in diesem Fall keine bestimmte Enum gibt, die funktionieren könnte. CASpringAnimation kann auf jede beliebige Eigenschaft angewendet werden, nicht nur auf eingebaute. Selbst "eingebaut" ist irreführend, da es viele eingebaute CALayer-Unterklassen gibt, die selbst unterschiedliche Eigenschaften haben. Animationen müssen nicht einmal auf eine Ebene angewendet werden (SceneKit verwendet sie auch). Wenn Sie einer Ebene eine benutzerdefinierte Eigenschaft hinzugefügt haben und diese mit einer Federanimation animieren möchten, wäre es unmöglich, dass es sich um eine Enumeration handelt.

Das heißt, Sie können besser als hier eine Zeichenfolge übergeben (oder auch eine Zeichenfolge konstant). Sie können #keyPath verwenden:

let flash = CASpringAnimation(keyPath: #keyPath(CALayer.borderColor)) 

Dies stellt Compiler-Überprüfung, dass diese Methode tatsächlich definiert ist. Dies erreicht viel von dem Ziel, das Sie mit einem Enum suchen, und gleichzeitig flexibel genug, um jedes Ziel und jede Eigenschaft zu handhaben.

in Zukunft hoffentlich, Core Animation wird den neuen Swift 4 „KeyPath“ -Typen akzeptieren, und Sie werden in der Lage sein, dies zu tun:

let flash = CASpringAnimation(keyPath: \CALayer.borderColor) 
+0

Vielen Dank für die weitere Erklärung, Rob. Was wäre ein Beispiel für einen nicht eingebauten Typ? Gibt es nicht eine endliche Anzahl von Eigenschaften in einer Ansicht, die animiert werden könnte? –

+1

Nicht integrierte, meine ich nur "eine benutzerdefinierte CALayer-Unterklasse." Ich mache diese die ganze Zeit. Es gibt eine unbegrenzte Anzahl von Eigenschaften auf einem Layer, die animiert werden können (und natürlich können sie dort Schlüssel * Pfade * und nicht nur einfache Eigenschaften sein). Ein Beispiel finden Sie unter https://github.com/rnapier/richtext-coretext/blob/master/PinchText/Classes/PinchTextLayer.m. Diese Ebene hat ein Wörterbuch mit dem Namen 'touchPointForIdentifier'. Ich animiere keyPath 'touchPointForIdentifier. .scale' (NSDictionary legt alle Schlüssel als Schlüsselpfade frei). "Maßstab" ist hier eine Eigenschaft in einer einfachen NSObject-Unterklasse (keine Schicht). –

+1

Ein einfacheres Beispiel finden Sie unter https://github.com/iosptl/ios7ptl/blob/master/ch08-Animation/Actions/Actions/CircleLayer.m Dies ist ein Kreislayer, der die Eigenschaft 'radius' animiert. (Implizit wird die radius -Eigenschaft animiert. Wenn Sie also 'circle.radius = 4' aufrufen, wird das animiert, aber es wird mit einer CABasicAnimation für den keyPath" radius "implementiert.) –

Verwandte Themen