2009-01-06 9 views
5

Ich habe eine Situation, in der ich viele CALayers habe, die auf Turn-based-Art animieren. Ich animiere die Position auf jedem dieser CALayers, aber sie haben genau die gleiche Dauer. Sobald alle diese CALayers mit der Animation fertig sind, wird ein neuer "Turn" gestartet und sie animieren erneut den Wechsel der Positionen.Mit Core Animation, gibt es eine Möglichkeit, Animationen für mehrere CALayers zu gruppieren?

Die ganze Idee ist, dass mit einer linearen Interpolation zwischen den Positionen, und mit einer konstanten Geschwindigkeit, ein Turn-basierten Übergang zwischen Staat zu Zustand wie eine Echtzeit-Animation aussieht. Dies ist jedoch mit vielen verschiedenen CALayern schwer zu erreichen.

CAAnimationGroup wird verwendet, um Animationen auf einem einzelnen CALayer zusammenzufassen. Aber ich frage mich, gibt es eine einfache Lösung für Gruppenanimationen, die die gleiche Dauer haben sollen, auf mehreren CALayern zusammen?

Edited eine Antwort auf Kevin Ballard Frage

Mein Problem liegt darin aufzunehmen. Ich erstelle Animationen für jeden meiner CALayers und setze dann diese in ein NSArray. Sobald ich den Rückruf erhalten habe, dass die individuelle Animation beendet ist, entferne ich sie vom NSArray. Sobald es leer ist, erstelle ich wieder Animationen für alle.

Bei mehr als ein paar Layern gibt es eine merkliche Verzögerung zwischen dem Ende aller Animationen und dem Start der neuen Animationen.

Ich stelle mir vor, dass wenn ich alle diese Animationen in einem einzigen gruppieren könnte, könnten viel mehr Schichten ohne eine Verzögerung zwischen den Animationen animiert werden. Dadurch werden die Illusionen einer zusammenhängenden Animation nicht ruiniert.

Antwort

5

Wenn Sie Animationen an mehrere CALayers innerhalb einer einzigen Methode anhängen, beginnen alle gleichzeitig (effektiv) mit der gleichen Zeit. Ich benutze diesen Ansatz in einem Puzzlespiel mit fallenden Bällen, am Ende der Animationen befestige ich die nächste Stufe der Animation an jeden Ball, der weitere Animationen benötigt.

Ich animiere bis zu 60 CALayers auf einmal und keine Verzögerungen zwischen den Phasen der Animation, aber ich nicht die Animationen in einem Array jeglicher Art zwischenspeichern, ich bin mir nicht sicher von thange Overhead Sie haben Dort.

Meine Animationen sind relativ einfach und erstellt und an jedem CALayer im laufenden Betrieb angebracht. Meine Sprites sind 60px quadratisch und verwenden ein paar Dutzend möglicher Bilder, um ihren Inhalt darzustellen.

In einigen Fällen gibt es Multiplikationsanimationen, die ich mit unterschiedlichen Startzeiten (mit beginTime) erstellen kann, ich bündle sie mit einer CAAnimationGroup - aber Sie sind möglicherweise nicht in der Lage, nachfolgende Animationen vorzuberechnen.

0

Wenn Sie 3 Animationen gleichzeitig zu 3 verschiedenen Layern hinzufügen, und sie haben die gleiche Dauer, würde ich erwarten, dass sie alle zusammen animieren. Welches Verhalten siehst du?

+0

Ich habe eine Antwort auf diese Frage in der Hauptfrage bearbeitet, da sie hier nicht hineinpasst. –

2

Wenn Sie Ihre Animationen in eine CATransaction einschließen, stellt CG sicher, dass sie alle während derselben Iteration der Hauptschleife ausgeführt werden.

[CATtransaction begin]; // alle Ihre Animationen [CATtransaction commit];

0

cp21yos: Können Sie Ihre Methode näher erläutern? Ich versuche, etwas Ähnliches zu tun, das heißt mehrere Schichten gleichzeitig zu animieren, mehr als einmal. Sie sagten: "Am Ende der Animationen befestige ich die nächste Stufe der Animation". Kannst du das erklären?Wenn ich versuche, zusätzliche Animationen in ein AnimationDidStop-Ereignis einzufügen, tritt nur die letzte Animation auf, statt die gesamte Folge von Animationen.