选项 1 交换根视图控制器(好)

切换根视图控制器有好处,虽然转换选项仅限于 UIViewAnimationOptions 支持的转换选项,因此根据你希望在流之间进行转换的方式可能意味着你必须实现自定义转换 - 这可能很麻烦。

你只需设置 UIApplication.shared.keyWindow.rootViewController 即可显示 Onboarding 流程

解雇是通过利用 UIView.transition(with:) 并将过渡风格作为 UIViewAnimationOptions 来处理的,在这种情况下是 Cross Dissolve。 (也支持翻转和卷曲)。

在转换回主视图之前,你还必须设置主视图的框架,因为你是第一次实例化它。

// MARK: - Onboarding

extension AppDelegate {

    func showOnboarding() {
        if let window = UIApplication.shared.keyWindow, let onboardingViewController = UIStoryboard(name: "Onboarding", bundle: nil).instantiateInitialViewController() as? OnboardingViewController {
            onboardingViewController.delegate = self
            window.rootViewController = onboardingViewController
        }
    }

    func hideOnboarding() {
        if let window = UIApplication.shared.keyWindow, let mainViewController = UIStoryboard(name: "Main", bundle: nil).instantiateInitialViewController() {
            mainViewController.view.frame = window.bounds
            UIView.transition(with: window, duration: 0.5, options: .transitionCrossDissolve, animations: {
                window.rootViewController = mainViewController
            }, completion: nil)
        }
    }
}