Note that there are some explanatory texts on larger screens.

plurals
  1. POBest Way to Perform Several Sequential UIView Animations?
    text
    copied!<p>I have a series of 8 UIView animations that occur directly after my view is loaded. Right now, I am accomplishing this by using the <code>animationDidStop:finished:context</code> delegate method, and everything works as expected. The problem is that I have a new method for each animation. Most of the code in each of these methods is repeated, with only the animation duration and the actual positioning of elements changing.</p> <p>I tried to create a single method which would be called and have the context hold the parameters needed to change the UI appropriately, but it seems to be recursively calling itself well past the amount of times I call it:</p> <pre><code>-(void)animationDidStop:(NSString *)animationID finished:(BOOL)finished context:(void *)context{ NSNumber *number = (NSNumber *)context; int animationStep = [number intValue]; int nextAnimationStep = animationStep + 1; NSNumber *nextAnimationStepNumber = [NSNumber numberWithInt:nextAnimationStep]; NSLog(@"Animation Step: %i", animationStep); CGRect firstFrame = CGRectMake(self.feedsScroll.frame.size.width * 2, 0.0f, self.secondFeedView.view.frame.size.width, self.secondFeedView.view.frame.size.height); CGRect thirdFrame = CGRectMake(self.feedsScroll.frame.size.width * 2, 0.0f, self.thirdFeedView.view.frame.size.width, self.thirdFeedView.view.frame.size.height); [UIView beginAnimations:nil context:nextAnimationStepNumber]; [UIView setAnimationBeginsFromCurrentState:YES]; [UIView setAnimationCurve:UIViewAnimationCurveLinear]; [UIView setAnimationDelegate:self]; if (animationStep &lt; 8) [UIView setAnimationDidStopSelector:@selector(animationDidStop:finished:context:)]; NSLog(@"Beginning animations"); switch (animationStep) { case 0: [UIView setAnimationDuration:.3]; self.firstFeedView.view.center = CGPointMake(self.firstFeedView.view.center.x + 30, self.firstFeedView.view.center.y); break; case 1: [UIView setAnimationDuration:.3]; self.firstFeedView.view.center = CGPointMake(self.firstFeedView.view.center.x - 30, self.firstFeedView.view.center.y); break; case 2: [UIView setAnimationDuration:.3]; [self.secondFeedView.view setFrame:firstFrame]; break; case 3: [UIView setAnimationDuration:.3]; self.secondFeedView.view.center = CGPointMake(self.secondFeedView.view.center.x + 30, self.firstFeedView.view.center.y); break; case 4: [UIView setAnimationDuration:.3]; self.secondFeedView.view.center = CGPointMake(self.secondFeedView.view.center.x - 30, self.firstFeedView.view.center.y); break; case 5: NSLog(@"Animation step 6"); [UIView setAnimationDuration:.5]; self.firstFeedView.view.center = CGPointMake(self.firstFeedView.view.center.x - 230, self.firstFeedView.view.center.y); self.secondFeedView.view.center = CGPointMake(self.secondFeedView.view.center.x - 230, self.firstFeedView.view.center.y); break; case 6: [UIView setAnimationDuration:.5]; [self.thirdFeedView.view setFrame:thirdFrame]; break; case 7: [UIView setAnimationDuration:.3]; self.thirdFeedView.view.center = CGPointMake(self.thirdFeedView.view.center.x + 30, self.firstFeedView.view.center.y); break; case 8: [UIView setAnimationDuration:.3]; self.thirdFeedView.view.center = CGPointMake(self.thirdFeedView.view.center.x - 30, self.thirdFeedView.view.center.y); break; default: break; } [UIView commitAnimations]; } </code></pre> <p>I know this is probably a naive implementation. I am new to iPhone development, and am looking for some best practices to apply here. Am I going about this in the wrong way?</p>
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload