如何避免 animateTransition(transitionContext) 协议方法(在 navigationController 推送方法中)删除以前的 ViewController 视图?

How to avoid animateTransition(transitionContext) protocol method(in navigationController push methods) from removing previous ViewController's view?

我必须推一个 viewController,它有一个 alpha 为 0.5 的调光视图。因此,ViewController 的视图必须在这个变暗的背景后面显示前一个控制器的视图。问题是我使用的导航控制器使用 UIViewControllerAnimatedTransitioning 协议来自定义动画。默认情况下,在将新的 viewController 推入堆栈后,navigationController 会自动删除之前的视图。那么,如何在完成这个过渡后保持之前的视图,这可能吗?

注意:我不想只将控制器的视图添加到导航控制器(这给了我导航功能中的奇怪行为),我确实需要以这种方式推送它,所以我可以继续使用应用程序代码模式。

代码:

func animateTransition(transitionContext: UIViewControllerContextTransitioning) {
    if isPresenting {
        let ContainerView = transitionContext.containerView()
        if let PresentedController = transitionContext.viewControllerForKey(UITransitionContextToViewControllerKey) {
            if let PresentedView = transitionContext.viewForKey(UITransitionContextToViewKey) {
            PresentedView.alpha         = 0
            PresentedView.frame         = transitionContext.finalFrameForViewController(PresentedController)

            ContainerView.addSubview(PresentedView)
            // i've also tried to add the fromView in the containerView.

            UIView.animateWithDuration(0.4, animations: {
                PresentedView.alpha     = 1
            }) {
                Completion in
                transitionContext.completeTransition(Completion)
            }
        }
        }
    } else {
        // dismiss code...
    }
}

感谢您的耐心等待。

几周前我也遇到过类似的情况。就我而言,我正在模态地展示我的视图控制器。我解决这个问题的方法是拍摄 fromViewController 视图的快照并将其用作 toViewController 视图的背景。

捕捉快照:

UIImage *snapshotImage = nil;
UIGraphicsBeginImageContextWithOptions(self.tabBarController.view.frame.size, NO, 0.0);
if ([self.tabBarController.view drawViewHierarchyInRect:self.tabBarController.view.bounds afterScreenUpdates:YES]) {
                snapshotImage = UIGraphicsGetImageFromCurrentImageContext();
                UIGraphicsEndImageContext();
            }

您可以为此捕获 transitionContext.containerView。将此图片传递给您的新 VC 并将其设置为 VC 视图的背景:

self.view.backgroundColor = [UIColor colorWithPatternImage:self.bgImage];

P.S。我不精通 Swift,因此您必须自己将代码转换为 swift,但希望这能为您提供一个不错的起点