Wie kann nur ein Teil der gesamten CALayer-Animation entlang eines UIBezierPfads animiert werden?

8

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%     
Van Du Tran 05.10.2015, 02:04
quelle

4 Antworten

2

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%     
wj2061 15.05.2016 09:32
quelle
0

Haben Sie versucht, die Eigenschaften fromValue und toValue festzulegen? Es sollte funktionieren, wenn Sie fromValue auf 0.0 und toValue auf 0.25

setzen     
Mysiaq 15.05.2016 10:09
quelle
0

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)

repeatCount

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

CAShapeLayer

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

Clever repeatCount

Sie können einen solchen repeatCount -Wert berechnen, bei dem die Animation bei 0,25 des Pfades endet.

  • schnappen Sie sich etwas bezier lib
  • extrahiere Bezier aus der Timing-Funktion mit getControlPointAtIndex:
  • löse Bezier, um seinen "Fortschrittswert" (normalerweise t genannt) zu erhalten, für den der "y" -Wert von Bezier mit deinem "erforderlichen Fortschritt" (0.25)
  • übereinstimmt
  • Berechne den 'x' Wert von bezier für diesen t - das ist der genaue Wert von repeatCount , den du brauchst

Animieren mit CAAnimation, ganz alleine

Art von fortgeschrittenen

  • schnappen Sie sich etwas bezier lib
  • Erstellen Sie eine benutzerdefinierte CALayer-Unterklasse mit dynamischer Eigenschaft, sagen wir rideProgress
  • fügt synthetisierte Eigenschaften für den Bezierpfad (aus Bezier-Lib, nicht CGPath) und Sublayer (zB rideLayer ) hinzu, um
  • zu animieren
  • überschreiben Sie needsDisplayForKey: für rideProgress key und initWithLayer: für alle eingeführten Eigenschaften ABER verwenden Sie self.rideLayer?.presentationLayer() anstelle von rideLayer
  • überschreiben Sie eines dieser: 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
  • zu berechnen
  • Vergiss nicht CATransaction.setDisableActions(true) , bevor du irgendeine animierbare Eigenschaft eines Layers
  • einstellst
  • schließlich, verwenden Sie jede Art von CAAnimation oder implizite Animation auf rideProgress Eigenschaft

Pfad teilen

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

    
gp-v 20.05.2016 03:33
quelle
0

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!

    
Mahdi Alirezaie 09.06.2016 06:30
quelle