title: UIView animations interacting badly
body: <p>I'm seeing what appears to be interaction between separate animations, and I'd really appreciate any suggestions to eliminate this effect.</p>
  
  <p>Basically:
  I've got an iPhone app which includes a button 'a' on the root view. Tapping 'a' pushes a view on a navigation view controller stack, with a flip animation. The pushed view has a button to pop the view back to the root.</p>
  
  <p>The underlying code:</p>
  
  <pre><code>- (IBAction)pushOneView{
  TheAppDelegate *delegate = [[UIApplication sharedApplication] delegate];
  [UIView beginAnimations:nil context:NULL];
  [UIView setAnimationDuration:0.5];
  [UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];
  [UIView setAnimationTransition: UIViewAnimationTransitionFlipFromRight 
                      forView:delegate.navigationController.view cache:NO];
  [delegate.navigationController 
              pushViewController:oneViewController animated:NO];
  [UIView commitAnimations];
  </code></pre>
  
  <p>}</p>
  
  <p>This seems to work fine, and the animation is quite smooth.</p>
  
  <p>The root view also includes a subview ('panelView'), and another button, 'b'.
  panelView can display either of two other subviews--tapping 'b' swaps between those subviews, with a spin animation. The code:</p>
  
  <pre><code>-(IBAction)swapPanels{
  UIViewController *coming;
  UIViewController *going;
  float rotation;
  
  if (self.aPanel.view.superview == nil) {
      coming = aPanel;
      going = bPanel;
      rotation = 3.14;
  }
  else {
      coming = bPanel;
      going = aPanel;
      rotation = -3.14;
  }
  
  // First half of spin
  [UIView beginAnimations:nil context:NULL];
  [UIView setAnimationDuration:0.25];
  CGAffineTransform swirlTransform = CGAffineTransformMakeRotation(rotation);
  panelView.transform = swirlTransform;
  [panelView setAlpha:0.1];
  [UIView commitAnimations];
  
  // Finish spin
  [UIView beginAnimations:nil context:NULL];
  [UIView setAnimationDuration:0.25];
  CGAffineTransform secondTransform = 
                          CGAffineTransformRotate(swirlTransform, rotation);
  panelView.transform = secondTransform;
  [panelView setAlpha:1];
  [UIView commitAnimations];
  
  // Swap the panels
  [going.view removeFromSuperview];
  [panelView insertSubview:coming.view atIndex:0];
  </code></pre>
  
  <p>}</p>
  
  <p>This also seems to work fine. Each of the swappable panels contains a picker and some labels.</p>
  
  <p>However, I notice that the 'a' transition becomes slow and jerky if the 'b' transition has been executed before it.
  In other words, if I start the app, run 'a' back and forth several times, it runs smoothly. Then exercise 'b' back and forth a few times. Then try 'a' again...'a' is now jerky, and will remain so until an app restart.</p>
  
  <p>This is 100% repeatable. It is subtle using the simulator, but quite obvious on a device.
  I have tested for leaks--none are shown by leaks tool.
  If the animation is removed from the 'b' operation (just comment-out the animation steps), the effect on 'a' is <em>not</em> observed after the 'b' subview swap is exercised.
  If the pickers are removed from the swappable panel nibs, the effect is similarly eliminated.
  If the 'a' animation transition is set to cache, then after 'b' it does not stutter in the middle, but seems to ignore animating, simply swapping the view (this may be a matter of perception).</p>
  
  <p>In case I'm not clear: I am NOT triggering these separate operations at the same time. Animation 'a', after 'b' has been executed--and completed--is not the same as if 'b' had never been executed. Is there clean-up I should be doing after an animation? Is my subview-swapping code flawed? Or...?</p>
  
  <p>Thanks in advance for any suggestions.</p>