I have a recursive function that plays a UIView animation continuously (if there is a better way to do this, please let me know):
-(void)playAnimationRecursive
{
[appDelegate commenceFishAnimation];
[animationView addSubview:appDelegate.fishAnimationImageView];
animationView.alpha=0.5;
[NSTimer scheduledTimerWithTimeInterval:14.0 target:self selector:@selector(playAnimationRecursive) userInfo:nil repeats:NO];
}
and not sure if this is neccessary, but here’s the appDelegate commenceFishAnimationMethod:
upperFish=[[UIImageView alloc] initWithImage:upperFishImage];
bigFish=[[UIImageView alloc] initWithImage:bigFishImage];
shark=[[UIImageView alloc] initWithImage:sharkImage];
groupFish=[[UIImageView alloc] initWithImage:groupFishImage];
fish1=[[UIImageView alloc] initWithImage:fish1Image];
fishAnimationImageView=[[[UIImageView alloc] init] retain];
//set the initial position of each fish to be out of frame
upperFish.frame=CGRectMake(-50, 150, 119/2, 93/2); //moves east
bigFish.frame=CGRectMake(-280, 340, 251/2, 137/2); //moves east
shark.frame=CGRectMake(-100, 390, 164/2, 52/2); //moves east
groupFish.frame=CGRectMake(500, 320, 155/2, 89/2); //moves west
fish1.frame=CGRectMake(370, 280, 155/2, 89/2); //moves west
//add fishes to current view
[fishAnimationImageView addSubview:upperFish];
[fishAnimationImageView addSubview:bigFish];
[fishAnimationImageView addSubview:shark];
[fishAnimationImageView addSubview:groupFish];
[fishAnimationImageView addSubview:fish1];
//animate the position of each fish view
[UIView beginAnimations:nil context:NULL];
[UIView setAnimationDuration:10.0];
[UIView setAnimationCurve:UIViewAnimationCurveLinear];
upperFish.transform=CGAffineTransformMakeTranslation(150, -200);
bigFish.transform=CGAffineTransformMakeTranslation(600, 0);
shark.transform=CGAffineTransformMakeTranslation(550, 0);
groupFish.transform=CGAffineTransformMakeTranslation(-600, 0);
fish1.transform=CGAffineTransformMakeTranslation(-550, 0);
[UIView commitAnimations];
[fishAnimationImageView release];
[upperFish release];
[bigFish release];
[shark release];
[groupFish release];
[fish1 release];
}
So what happens is that every view I have plays this animation in the BG, so if I’m on view A, then it calls the recursive function and plays the animation continuously. If I move to view B, then it calls the recursive function also and plays the animation continuously. However, I’m getting memory warning level 2, and I’m thinking maybe it’s because view A is still calling the recursive method? If that is the reason, then how would I stop the recursive method on unload? Or is that not my problem?
EDIT:
Here’s my code now (animation doesn’t loop)
-(void)commenceFishAnimation
{
UIImageView *newImageView=[[UIImageView alloc] init];
self.fishAnimationImageView=newImageView;
upperFish=[[UIImageView alloc] initWithImage:upperFishImage];
bigFish=[[UIImageView alloc] initWithImage:bigFishImage];
shark=[[UIImageView alloc] initWithImage:sharkImage];
groupFish=[[UIImageView alloc] initWithImage:groupFishImage];
fish1=[[UIImageView alloc] initWithImage:fish1Image];
//set the initial position of each fish to be out of frame
upperFish.frame=CGRectMake(-50, 150, 119/2, 93/2); //moves east
bigFish.frame=CGRectMake(-280, 340, 251/2, 137/2); //moves east
shark.frame=CGRectMake(-100, 390, 164/2, 52/2); //moves east
groupFish.frame=CGRectMake(500, 320, 155/2, 89/2); //moves west
fish1.frame=CGRectMake(370, 280, 155/2, 89/2); //moves west
//add fishes to current view
[fishAnimationImageView addSubview:upperFish];
[fishAnimationImageView addSubview:bigFish];
[fishAnimationImageView addSubview:shark];
[fishAnimationImageView addSubview:groupFish];
[fishAnimationImageView addSubview:fish1];
//animate the position of each fish view
[UIView beginAnimations:nil context:NULL];
[UIView setAnimationDuration:10.0];
[UIView setAnimationCurve:UIViewAnimationCurveLinear];
upperFish.transform=CGAffineTransformMakeTranslation(150, -200);
bigFish.transform=CGAffineTransformMakeTranslation(600, 0);
shark.transform=CGAffineTransformMakeTranslation(550, 0);
groupFish.transform=CGAffineTransformMakeTranslation(-600, 0);
fish1.transform=CGAffineTransformMakeTranslation(-550, 0);
[UIView setAnimationDelegate:self];
[UIView setAnimationDidStopSelector:@selector(commenceFishAnimation)];
[UIView commitAnimations];
[fishAnimationImageView release];
[upperFish release];
[bigFish release];
[shark release];
[groupFish release];
[fish1 release];
//[newImageView release]; //if I release it, then my animation doesn't play for some reason
}
Then in some other class in the viewDidLoad method, I do this:
[appDelegate commenceFishAnimation];
[animationView addSubview:appDelegate.fishAnimationImageView];
But the animation only plays once.
That’s not the best way chaining animations, use this instead:
That will chain your animations in an infinite loop.
But also note that in your method
playAnimationRecursiveyou are adding subviews and scheduling aNSTimerevery 14 seconds without releasing them. Thats a really bad idea.To sum up: forget about recursion and use the method above.
EDIT: I forgot to mention that you have to assign the delegate of the animation: