Tweening / Interpolation zwischen zwei CGPaths / UIBeziers
Ich habe eine CAShapeLayer enthält eine CGPath. Mit der eingebauten animation von iOS kann ich einfach morph diesem Weg in eine andere mit Hilfe einer animation:
CABasicAnimation *morph = [CABasicAnimation animationWithKeyPath:@"path"];
morph.fromValue = (id)myLayer.path;
mayLayer.path = [self getNewPath];
morph.toValue = (id)myLayer.path;
morph.duration = 0.3;
[myLayer addAnimation:morph forKey:nil];
Einwandfrei funktioniert.
Allerdings würde ich jetzt gerne morph allmählich zwischen diese Pfade während eines drag-Vorgangs. Um dies zu tun, ich muss in der Lage sein, zum abrufen der interpolierten Pfad zu irgendeinem Zeitpunkt während der ziehen. Gibt es eine Möglichkeit zu Fragen, für iOS das?
- In nicht-trivialen Fällen, die eingebaute morphing-Pfade unbrauchbar ziemlich schnell. Das problem sehen und Erklärungen hier beschrieben: stackoverflow.com/a/17864445/438982
- Das stimmt, aber in meinem Fall ist das morphing gut aussieht...
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dies ist eigentlich viel einfacher, dann würden Sie zuerst denken, und verwendet Animationen, die mit "Nein" Geschwindigkeit (pausiert). Jetzt mit der angehaltene animation Hinzugefügt, um die Ebene, die Sie ändern können, der Zeit-offset zu springen zu einem bestimmten Zeitpunkt innerhalb der animation.
Wenn Sie nicht planen, läuft auf die animation von selbst (also nur die Steuerung manuell), würde ich vorschlagen, dass Sie die Dauer der animation 1. Dies bedeutet, dass Sie den Zeit-offset von 0 auf 1, wenn Wechsel von 0% auf 100%. Wenn Ihre Dauer war bei 0,3 (wie in deinem Beispiel), dann legen Sie den time offset auf einen Wert zwischen 0 und 0,3 statt.
Umsetzung
Wie ich oben sagte, es gibt sehr wenig code beteiligt, die in diesem kleinen trick.
speed
von der Ebene (ja, Sie entsprechenCAMediaTiming
) oder die animation 0.0timeOffset
von der Schicht oder der animation (je nachdem, was Sie Tat in Schritt 2).Dies ist, wie konfiguriert ich meine animation + Formebene
Und den regler Aktion:
Können Sie sehen, die Ende Ergebnis unten. Happy coding!
[layer convertTime:CACurrentMediaTime() fromLayer:nil]
. Siehe die Antwort für mehr Informationen.