Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Multiple CAAnimations for animationDidStop method?

Tags:

I know you have to use this method to get the delegate method for when the animation has finished:

- (void)animationDidStop:(CAAnimation *)theAnimation finished:(BOOL)flag {

The problem is, how would I distinguish between multiple CAAnimations like 2 or more?

I googled this and I haven't found anything useful.

Please share with me on how you accomplished this!

Thanks!

like image 877
SimplyKiwi Avatar asked Oct 13 '11 02:10

SimplyKiwi


2 Answers

You can set key/value objects for CAAnimation instance like this:

CABasicAnimation *theAnimation = [CABasicAnimation animationWithKeyPath:@"opacity"];
[theAnimation setValue:@"animation1" forKey:@"id"]; 
theAnimation.delegate = self;

CABasicAnimation *theAnimation2 = [CABasicAnimation animationWithKeyPath:@"opacity"];
[theAnimation2 setValue:@"animation2" forKey:@"id"];    
theAnimation2.delegate = self;

Check which one was called in delegate method:

- (void)animationDidStop:(CAAnimation *)anim finished:(BOOL)flag{
    if([[anim valueForKey:@"id"] isEqual:@"animation1"]) {
        NSLog(@"animation1");
    }
    if([[anim valueForKey:@"id"] isEqual:@"animation2"]) {
        NSLog(@"animation2");
    }
}
like image 169
beryllium Avatar answered Sep 25 '22 01:09

beryllium


A CAAnimation object is supposed to be reused from time to time and that's why I don't like to give it a certain key (since it's not unique). What makes it unique is the association with a CALayer with addAnimation:forKey:. For this reason I use the following code in animationDidStop:

if animation == layer.animationForKey(AnimationKeys.scaleUp) {
   // scaleUp animation has completed
}
like image 27
fruitcoder Avatar answered Sep 25 '22 01:09

fruitcoder