Nicht nur CGPath
ist undurchsichtig, aber auch CAAnimation
unterstützt kein Updates oder Benachrichtigungen für die laufenden Animationen (dh nach dem Start aber bevor fertig). Die einzigen beteiligten Entitäten sind die Animation selbst und CALayer
-s, auf die es angewendet wird.
So Optionen sind:
(einige Optionen zu gruselig klingen, aber sie sind es nicht, so habe ich ein Beispielprojekt, siehe unten)
repeat
Wie wj2061 ist erwähnt his answer Sie kann Animation repeatCount
zwicken. Cons ist es 0,25 Animationszeit animieren wird, nicht 0,25 Pfad
CAShapeLayer
Wenn durch Zufall, können Sie Ihre ticker
mit CAShapeLayer
Segment, dann können Sie animieren strokeStart
und strokeEnd
so wird es wie Segment aussehen entlang des Weges ist
bewegt
Clever repeat
Sie können solche repeatCount
Wert berechnen, dass Animation bei 0,25 Pfad zu stoppen.
- greifen einige Bezier-lib
- Extrakt Bezier aus Timing-Funktion mit
getControlPointAtIndex:
- lösen Bezier seine „Fortschrittswert“ zu erhalten (in der Regel
t
genannt), für die der Bezier ‚y‘ den Wert Ihrer „erforderlich übereinstimmen Fortschritt“(0,25)
- berechnen des Bezier 'x' Wert für diese
t
- das ist genau Wert von repeatCount
Sie benötigen
Anim Ating mit CAAnimation, ganz alleine
Art vorgerückter
- greifen einige Bezier-lib
- benutzerdefinierte CALayer Unterklasse mit dynamischen Eigenschaft erstellen, lassen Sie uns
rideProgress
- Add synthetisierten Eigenschaften für Bezierpfad sagen (von Bezier lib, nicht CGPath) und Sublayer (zB
rideLayer
) zu animieren
- überschreiben
needsDisplayForKey:
für rideProgress
Schlüssel und initWithLayer:
für alle eingeführten Eigenschaften ABER verwenden Sie self.rideLayer?.presentationLayer()
anstelle von rideLayer
- überschreiben Sie eine dieser:
drawInContext:
und zeichnen Sie, was Sie darin brauchen; Oder (besser) display
, in display
aktuellen Wert rideProgress
Wert von abrufen und Sublayer aktualisieren, dann rufen Sie super. So oder so, verwendet Bezier lib Position und Rotation für Unterschicht zu aktuellem rideProgress
Wert
- nicht vergessen
CATransaction.setDisableActions(true)
entsprechend zu berechnen, bevor sie eine animierbaren Eigenschaft jeder Schicht
- schließlich Einstellung, verwenden Sie jede Art von CAAnimation oder impliziter Animation auf
rideProgress
Immobilien
Split Weg
Wieder von wj2061 vorgeschlagen. Sie können den Pfad so eine der Hälften geteilt 0,25 Original
Here ist Beispielimplementierung alles über AUSSER „Split Pfad“ vertreten wird. Ich habe keine Feldtests mit diesem Code durchgeführt, es ist nur ein funktionierendes Konzept. XCode 7.3.1, Schnell.
Verwendete Materialien: Wiki on Cubic function, Great article about operations on beziers, Cubic equations solving method line-by-line
Das Problem dabei ist, dass die Animation nicht ein Viertel des Weges durch den * Pfad * stoppt, nur 1/4 des Weges durch die * Animation *. Mit einer 'kCAMediaTimingFunctionEaseInEaseOut'-Timing-Funktion und 0,25 für' repeatCount' stoppt die Animation früher als erwartet. Außerdem wird die Timing-Funktion immer noch auf die gesamte Dauer der Animation angewendet - und daher scheint sie schneller zu werden und dann plötzlich zu stoppen, was OP sein kann oder auch nicht. – Hamish
@ originaluser2, Sie sind richtig. Ich fand die Animation nicht perfekt, wo ich dachte, das würde es tun, also erklärt es das! Vielen Dank! Ich suche nach 1/4 des Pfades, nicht nach der Animation. –