UIViewControllerContextTransitioning 和 UINavigationControllerDelegate

UIViewControllerContextTransitioning and UINavigationControllerDelegate

我的代码:

navigator.m

- (void)newPushPage:(UIViewController *)controller
{
    [self pushViewController:controller animated:YES];
}
- (id<UIViewControllerAnimatedTransitioning>)navigationController:(UINavigationController *)navigationController
                                  animationControllerForOperation:(UINavigationControllerOperation)operation
                                               fromViewController:(UIViewController *)fromVC
                                                 toViewController:(UIViewController *)toVC
{
    if (operation == UINavigationControllerOperationPush || operation == UINavigationControllerOperationPop)
    {
        self.animator = [Animator new]; 
        return self.animator;
    }
    return nil;
}

animator.m

- (NSTimeInterval)transitionDuration:(id <UIViewControllerContextTransitioning>)transitionContext
{
    return 0.5;
}

- (void)animateTransition:(id<UIViewControllerContextTransitioning>)transitionContext
{
    UIViewController* toViewController = [transitionContext viewControllerForKey:UITransitionContextToViewControllerKey];
    UIViewController* fromViewController = [transitionContext viewControllerForKey:UITransitionContextFromViewControllerKey];
    [[transitionContext containerView] addSubview:toViewController.view];
    toViewController.view.alpha = 0;

    [UIView animateWithDuration:[self transitionDuration:transitionContext] animations:^{
        fromViewController.view.transform = CGAffineTransformMakeScale(0.1, 0.1);
        toViewController.view.alpha = 1;
    } completion:^(BOOL finished) {
        fromViewController.view.transform = CGAffineTransformIdentity;
        [transitionContext completeTransition:![transitionContext transitionWasCancelled]];

    }];

}

在 pushPage 和屏幕出现后,出现了一个问题:隐藏在代码中的所有元素都可见,而且我已经看到屏幕上的元素是如何消失的。看起来不雅观。有办法吗?

inside animateTransition (id)transitionContext 协议 push 和 pop transition 应该单独处理,如下所示。

//1.Settings for the fromVC ..

UIViewController *fromVC = [transitionContext viewControllerForKey:UITransitionContextFromViewControllerKey];
UIViewController *toVC = [transitionContext viewControllerForKey:UITransitionContextToViewControllerKey];
CGRect sourceRect = [transitionContext initialFrameForViewController:fromVC];
CGRect finalFrameForVC = [transitionContext finalFrameForViewController:toVC];

//2.Insert toVC 视图。

   if(pushCondition) { 
   UIView *container = [transitionContext containerView];
    [container insertSubview:toVC.view aboveSubview:fromVC.view];
    toVC.view.alpha = 0.5;
    toVC.view =
} else if (popCondition ){
    UIView *container = [transitionContext containerView];
    toVC.view.frame = finalFrameForVC;
    toVC.view.alpha = 0.5;
    [container addSubview:toVC.view];
    [container sendSubviewToBack:toVC.view];
    UIView *snapShoot = [fromVC.view snapshotViewAfterScreenUpdates:false];
} 

//3.Perform动画.

    [UIView animateWithDuration:1.0
                          delay:0.0
         usingSpringWithDamping:1.0
          initialSpringVelocity:6.0
                        options:UIViewAnimationOptionCurveLinear
                     animations:^{

                         //Setup the final parameters of views for push  
                         toVC.view // update final view frame
                         toVC.view.alpha = 1.0;
                        //Setup the final parameters of views for pop
                        snapShoot.frame = 
                     } completion:^(BOOL finished) {
                         //When the animation is completed call completeTransition with final push value
                        [snapShoot removeFromSuperview];
                         //When the animation is completed call completeTransition with final push value
                         toVC.view.alpha= 1.0;
                         [transitionContext completeTransition:YES];

                     }];

在 amimator 中创建枚举/标志 属性 并将其设置在导航控制器委托中。

if (operation == UINavigationControllerOperationPush)
{
    self.animator = [Animator new]; 
    self.animator.pushPopAnimation = UINavigationControllerOperationPush;
    return self.animator;
}

查看snapshotViewAfterScreenUpdates的apple文档:上面代码中的(BOOL)afterUpdates方法