Ich schaffe es, einen CALayer entlang eines UIBezierPfads zu animieren.
Was ich versuche, ist, nur einen Prozentsatz des Pfades zu animieren, zum Beispiel nur 25% des Pfades, wobei die Ebene an dieser Position bleibt (bei 25%).
Wie soll man das machen? Hier ist mein Code, es animiert immer den vollständigen Pfad.
%Vor%Einfach eine Eigenschaft ändern:
%Vor%Hier ist ein exzellenter Artikel zum Animationstiming , hier erfahren Sie, wie Sie noch feinere Kontrolle darüber haben deine Animationen.
Anhängen:
1. Um das zu erreichen, was Sie wollen, ist der nächste Weg, einen 25% subPath zu haben, hier einige Hilfsmethode .
2.Wenn Sie die Geschwindigkeitsdifferenz aushalten können, verwenden Sie die obige Methode und setzen Sie die Position zurück, wenn die Animation endet:
%Vor% Nicht nur CGPath
ist undurchsichtig, sondern auch CAAnimation
unterstützt keine Aktualisierungen oder Benachrichtigungen für laufende Animationen (d. h. nach dem Start, aber vor dem Abschluss). Die einzigen beteiligten Entitäten sind die Animation selbst und CALayer
-s, auf die sie angewendet wird.
So sind Optionen:
(Einige Optionen mögen zu beängstigend klingen, sind es aber nicht, also habe ich ein Beispielprojekt gemacht, siehe unten)
Wie wj2061 erwähnt ist seine Antwort können Sie Animation repeatCount
zwicken. Cons ist es wird animieren 0,25 Animationszeit, nicht 0,25 von Pfad
Wenn Sie Ihr ticker
mit CAShapeLayer
Segment repräsentieren können, dann können Sie strokeStart
und strokeEnd
animieren, so dass es so aussieht, als würde sich das Segment entlang des Pfades bewegen
Sie können einen solchen repeatCount
-Wert berechnen, bei dem die Animation bei 0,25 des Pfades endet.
getControlPointAtIndex:
t
genannt) zu erhalten, für den der "y" -Wert von Bezier mit deinem "erforderlichen Fortschritt" (0.25) t
- das ist der genaue Wert von repeatCount
, den du brauchst Art von fortgeschrittenen
rideProgress
rideLayer
) hinzu, um needsDisplayForKey:
für rideProgress
key und initWithLayer:
für alle eingeführten Eigenschaften ABER verwenden Sie self.rideLayer?.presentationLayer()
anstelle von rideLayer
drawInContext:
und zeichnen Sie, was Sie darin benötigen; oder (besser) display
, in display
lade den aktuellen rideProgress
-Wert von presentationLayer
und aktualisiere Sublayer, dann rufe super an. In beiden Fällen verwenden Sie bezier lib, um Position und Rotation für den Sublayer entsprechend dem aktuellen rideProgress
value CATransaction.setDisableActions(true)
, bevor du irgendeine animierbare Eigenschaft eines Layers rideProgress
Eigenschaft Noch einmal, vorgeschlagen von wj2061 . Sie können den Pfad so aufteilen, dass eine der Hälften 0,25 von Original darstellt
Hier ist eine Beispielimplementierung für alles oben, mit Ausnahme von "Split path". Ich habe keine Feldtests mit diesem Code durchgeführt, es ist nur ein funktionierendes Konzept. XCode 7.3.1, Schnell.
Verwendete Materialien: Wiki auf Cubic-Funktion , Großer Artikel über Operationen an Beziers , Lösungsalgorithmen für kubische Gleichungen Zeile für Zeile
Ich stieß auf das gleiche Problem, und ich wollte die Zeichnung eines Pfades animieren, aber nur einen Prozentsatz davon.
Was ich am Ende getan habe, war, die StrokeStart und StrokeEnd der Ebene auf dieselben Gleitkommawerte wie die Animation zu setzen.
Versuchen Sie in Ihrem Beispiel, anim.fromValue = 0.0f
, anim.toValue = 0.6f und auch ticker.strokeStart=0.0f
und ticker.strokeEnd = 0.6f
zu setzen.
Dies hat nur 60% des Pfades gezeichnet und auch animiert!
Tags und Links ios cakeyframeanimation caanimation