使用一个动画关闭并呈现模态视图控制器

kik*_*tas 5 uiviewcontroller ios presentviewcontroller

问题是我不知道如何解雇和呈现只有一个过渡动画的视图控制器.

我的故事板结构是:

在此输入图像描述 我们可以说A控制器是在NavigationController之后,B是Startup引用,C是TabBar ViewController.既Ç与一个模态呈现交叉溶解过渡.

当用户登录到应用程序(来自B)时,C控制器以模态方式呈现,具有翻转水平过渡.当用户注销(来自C)时,B以相同的方式呈现.在A控制器上,我根据用户是否记录执行直接segue到BC.

我的问题是如果我不从BC中解除以前的视图控制器,那么该控制器就会泄露.相反,如果我解除它,则在呈现目标控制器(BC)之前显示A.

是否可以仅显示" 水平翻转""查看"视图?

kik*_*tas 5

我对这个问题的解决方案是替换当前的 rootViewController,支持不同的转换:

static func replaceRootViewController(with viewController: UIViewController, transition: UIViewAnimationOptions, completion: (() -> ())? = nil) {        
    if transition == .transitionCrossDissolve {
        let overlayView = UIScreen.main.snapshotView(afterScreenUpdates: false)
        viewController.view.addSubview(overlayView)
        UIApplication.shared.keyWindow?.rootViewController = viewController

        UIView.animate(withDuration: 0.65, delay: 0, options: transition, animations: {
            overlayView.alpha = 0
        }, completion: { finished in
            overlayView.removeFromSuperview()
            if let completion = completion{
                completion()
            }
        })
    } else {
        _ = viewController.view
        UIView.transition(with: UIApplication.shared.keyWindow!, duration: 0.65,options: transition, animations: {
            UIApplication.shared.keyWindow?.rootViewController = viewController
        }){_ in
            if let completion = completion {
                completion()
            }

        }
    }
}
Run Code Online (Sandbox Code Playgroud)