How can I chain Core Animations for different Layers one after the other?
The beginTime
property of a CAAnimation
only seems to work if the CAAnimation
is part of a CAAnimationGroup
. I think you'll also need to set the duration
property of the CAAnimationGroup
large enough to last until its final animation completes.
https://stackoverflow.com/a/563486/77567
Actually, it turns out that the key is getting the current time in terms of a frame of reference and adding any time offset to that current time. This works also for non-grouped animations.
For instance, something along the lines of this code would cause n layers (assumed to be stored in some array) to sequentially fade in one after the other, each taking .8 secs.:
CGFloat timeOffset = 0;
[CATransaction begin];
for (CALayer *layer in layers) {
CABasicAnimation *a = [CABasicAnimation animationWithKeyPath:@"opacity"];
a.fromValue = @(0);
a.toValue = @(1);
a.fillMode = kCAFillModeForwards;
a.beginTime = [layer convertTime:CACurrentMediaTime() fromLayer:nil] + timeOffset;
a.duration = 0.8;
a.removedOnCompletion = NO;
[layer addAnimation:a forKey:nil];
timeOffset += a.duration;
}
[CATransaction commit];
In the above case, the frame of reference is simply the current time when the invocations take place.