title: iOS 7 custom transitions with UINavigationController
body: <p>This video shows the issue I am having.
  <a href="http://www.youtube.com/watch?v=C9od_2KZAbs" rel="noreferrer">http://www.youtube.com/watch?v=C9od_2KZAbs</a></p>
  
  <p>I am attempting to create a custom interactive push transition using a UIPanGestureRecognizer. I have an interactive transition delegate (using UIPercentDrivenInteractiveTransition) and a transition animator. completeTransition: seems to re-animate the push unnecessarily.</p>
  
  <p>Here is how the pan gesture controls the transition:</p>
  
  <pre><code>- (void) panGestureRecognized:(UIPanGestureRecognizer *) gestureRecogznier {
  
      CGPoint translation = [gestureRecogznier translationInView:gestureRecogznier.view];
  
      if (gestureRecogznier.state == UIGestureRecognizerStateBegan) {
  
          self.interactiveTransitionAnimator = [[UIPercentDrivenInteractiveTransition alloc] init];
  
          EVDetailViewController *detailViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"EVDetailViewController"];
          [self.navigationController pushViewController:detailViewController animated:YES];
      }
      else if (gestureRecogznier.state == UIGestureRecognizerStateChanged) {
  
          CGFloat d = (translation.x / CGRectGetWidth(self.view.bounds)) * -1;
          [self.interactiveTransitionAnimator updateInteractiveTransition:d];
      }
      else if (gestureRecogznier.state == UIGestureRecognizerStateEnded) {
  
          if ([gestureRecogznier velocityInView:self.view].x &lt; 0) {
              [self.interactiveTransitionAnimator finishInteractiveTransition];
          } else {
              [self.interactiveTransitionAnimator cancelInteractiveTransition];
          }
  
          self.interactiveTransitionAnimator = nil;
      }
  }
  </code></pre>
  
  <p>The UINavigationControllerDelegate handles the vending of both transition delegate objects, which is triggered when pushViewController: is called.</p>
  
  <p>The transition animator has a very simple animation:</p>
  
  <pre><code>- (void)animateTransition:(id&lt;UIViewControllerContextTransitioning&gt;)transitionContext {
  
      UIViewController* toViewController = [transitionContext viewControllerForKey:UITransitionContextToViewControllerKey];
      [[transitionContext containerView] addSubview:toViewController.view];
  
      CGRect finalToVCFrame = [transitionContext finalFrameForViewController:toViewController];
  
      if (self.operation == UINavigationControllerOperationPush) {
  
          // set offscreen to the right
          toViewController.view.frame = CGRectMake(320.0f, 0.0f, 320.0f, 568.0f);
  
          [UIView animateWithDuration:[self transitionDuration:transitionContext] delay:0.0f options:0 animations:^{
  
              toViewController.view.frame = finalToVCFrame;
  
          } completion:^(BOOL finished) {
  
              // *** When this is called, the glitch occurs
              [transitionContext completeTransition:YES];
          }];
      }
  }
  </code></pre>
  
  <p>In the video, the pan gesture ends about 60% of the way through, which triggers the finishInteractiveTransition call. Everything goes smoothly until the completion block in the UIView block-based animation calls completeTransition:. When this method is called, the toViewController re-animates the last part of the push animation unnecessarily. In the video the red view is the window. The animation duration is 3 seconds.</p>
  
  <p>I cannot figure out why this happens. It looks like the animation between the point when the gesture ends and when completeTransition: is called happens twice. Any ideas?</p>