Core Animationを使用して、複数のCALayerのアニメーションをグループ化する方法はありますか?
-
03-07-2019 - |
質問
「ターンベース」でアニメーションする多くのCALayersがある状況があります。ファッション。これらのCALayerのそれぞれの位置をアニメーション化しますが、それらはまったく同じ期間です。これらのCALayerのすべてがアニメーションを完了すると、新しい「ターン」開始され、再び変化する位置をアニメーション化します。
全体の考え方は、位置間の線形補間と一定の速度で、状態から状態へのターンベースの遷移がリアルタイムのアニメーションのように見えるということです。ただし、これは多くの異なるCALayerで達成するのは困難です。
CAAnimationGroupは、単一のCALayerでアニメーションをグループ化するために使用されます。しかし、私は疑問に思っていました、複数のCALayerで同じ持続時間を持つはずのアニメーションをグループ化する簡単な解決策はありますか?
ケビンバラードの質問への返信を含めるように編集
私の問題はこれにあります。 CALayersごとにアニメーションを作成してから、 NSArray内のもの。個々のアニメーションが終了したというコールバックを取得したら、NSArrayから削除します。空になったら、再びすべてのアニメーションを作成します。
複数のレイヤーがあると、すべてのアニメーションが終了してから新しいアニメーションが開始されるまでに顕著な遅延があります。
これらのアニメーションをすべて1つにグループ化できれば、アニメーション間の遅延なしに、より多くのレイヤーをアニメーション化できると思います。これにより、連続するアニメーションの錯覚を台無しにしないでください。
解決
1つのメソッド内で複数のCALayerにアニメーションを添付すると、それらはすべて(事実上)同時に開始されます。ボールを落とすパズルゲームでこのアプローチを使用します。アニメーションの最後に、アニメーションの次のステージを、さらにアニメーションが必要なボールにアタッチします。
一度に最大60人のCALayerをアニメーション化しており、アニメーションのステージ間で遅延が発生していませんが、アニメーションを任意の種類の配列にキャッシュしません。オーバーヘッドがあるかどうかはわかりません。
私のアニメーションは比較的単純で、各CALayerにオンザフライで作成および添付されます。私のスプライトは60ピクセルの正方形で、数十個の画像を使用してコンテンツを表します。
場合によっては、異なる開始時間(beginTimeを使用)で作成できる複数のアニメーションがあり、それらをCAAnimationGroupにバンドルしますが、後続のアニメーションを事前計算できない場合があります。
他のヒント
CATransactionでアニメーションをラップすると、CGはメインループの同じ反復中にすべてが実行されるようにします。
[CATransaction begin]; //すべてのアニメーション [CATransaction commit];
3つのアニメーションを3つの異なるレイヤーにすべて同時に追加し、それらのアニメーションの長さが同じである場合、それらすべてが一緒にアニメーション化されると予想されます。どのような動作が見られますか?
cp21yos:メソッドについて詳しく説明できますか?私は似たようなことをしようとしています。これには、一度に複数のレイヤーを複数回アニメーション化することが含まれます。あなたは言いました:"アニメーションの最後に、アニメーションの次のステージを添付します"。説明できますか? animationDidStopイベントに追加のアニメーションを実行するロジックを配置しようとすると、アニメーションのシーケンス全体ではなく、最後のアニメーションのみが発生します。