2016-06-01 16 views
1

Ich erstelle derzeit eine kleine Schaltfläche mit zwei verschiedenen Status. Jeder Zustand wird durch zwei CAShapeLayer s dargestellt und der Übergang zwischen den Zuständen wird mit einer Reihe von CAKeyframeAnimation s/CABasicAnimation s animiert, die alle die Pfadeigenschaft der Formebenen ändern. Meine Frage ist, wie animiere ich einen Zustand ausgehend von einer aktuellen Animation (d. H. Knopf wird während der Animation gedrückt).So erhalten Sie den aktuellen Animationsschritt von einem CAKeyframeAnimation

Normalerweise würde ich die Präsentationsschicht für den aktuellen Eigenschaftswert stellen und eine additive Animation verwenden (wie perfekt here beschrieben), aber da dies ein mehrstufiger Animation ist, würde ich herausfinden muss, welcher Schritt ich derzeit Animieren und ketten Sie dann die entsprechende Animation, um den vorherigen Zustand umzukehren. Aber das ist ziemlich schwierig (ich wollte die ganze Animation removeOnCompletion=false haben und den Zeitversatz der Animationen abfragen, um herauszufinden, welche Animation gerade aktiv ist und wie weit).

Leider ist das Einstellen der Layer-Geschwindigkeit auf 0.0 und animieren nur die hin und her funktioniert nicht, da ich sekundäre Animationen haben, die sich in der entgegengesetzten Richtung anders verhalten.

Die Verwendung einer benutzerdefinierten Layer-Eigenschaft für die Formebenen scheint umständlich, aber ich könnte eine Fortschrittseigenschaft einfacher mit dem aktuellen Animationsschritt vergleichen.

Antwort

2

So nach ein paar Versuchen und ich komme mit der folgenden "Lösung": Ich verwende eine CADisplayLink, um eine Zeitaktualisierung für jedes Bild und durch Subtrahieren der aktuellen Zeitstempel von der Zeitmarke, wenn die Animation gestartet, kann ich herausfinden die verstrichene Animationszeit, also der Fortschritt (durch dividieren durch animationDuration). Auf diese Weise kann ich die umgekehrte Animation mit einem Offset starten. Intern berechne ich den nächsten Frame aus der Keyframe-Animation und passe die keyTimes für die neue Dauer an. Sie können eine Implementierung dieser here

sehen