tl;dr:前の終了後に各アニメーションを手動で追加する必要があります。
シーケンシャル アニメーションを追加する組み込みの方法はありません。各アニメーションの遅延を以前のすべてのアニメーションの合計に設定することもできますが、お勧めしません。
代わりに、すべてのアニメーションを作成し、それらを実行する順序で (配列をキューとして使用して) 可変配列に追加します。次に、すべてのアニメーションに対するアニメーション デリゲートとして自分自身を設定することでanimationDidStop:finished:
、アニメーションが終了するたびにコールバックを取得できます。
そのメソッドでは、配列から最初のアニメーション (次のアニメーションを意味する) を削除し、それをレイヤーに追加します。あなたはデリゲートであるため、2 番目のアニメーションが終了するとanimationDidStop:finished:
コールバックが再度実行され、次のアニメーションが可変配列から削除され、レイヤーに追加されます。
アニメーションの配列が空になると、すべてのアニメーションが実行されます。
開始するためのサンプル コード。まず、すべてのアニメーションを設定します。
CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"backgroundColor"];
[animation setToValue:(id)[[UIColor redColor] CGColor]];
[animation setDuration:1.5];
[animation setDelegate:self];
[animation setValue:[view layer] forKey:@"layerToApplyAnimationTo"];
// Configure other animations the same way ...
[self setSequenceOfAnimations:[NSMutableArray arrayWithArray: @[ animation, animation1, animation2, animation3, animation4, animation5 ] ]];
// Start the chain of animations by adding the "next" (the first) animation
[self applyNextAnimation];
次に、デリゲート コールバックで、次のアニメーションを再度適用するだけです
- (void)animationDidStop:(CAAnimation *)animation finished:(BOOL)finished {
[self applyNextAnimation];
}
- (void)applyNextAnimation {
// Finish when there are no more animations to run
if ([[self sequenceOfAnimations] count] == 0) return;
// Get the next animation and remove it from the "queue"
CAPropertyAnimation * nextAnimation = [[self sequenceOfAnimations] objectAtIndex:0];
[[self sequenceOfAnimations] removeObjectAtIndex:0];
// Get the layer and apply the animation
CALayer *layerToAnimate = [nextAnimation valueForKey:@"layerToApplyAnimationTo"];
[layerToAnimate addAnimation:nextAnimation forKey:nil];
}
layerToApplyAnimationTo
各アニメーションがそのレイヤーを認識できるように、カスタム キーを使用しています(それはsetValue:forKey:
とだけで機能しvalueForKey:
ます)。