RootViewController 过渡效果不起作用

RootViewController transition effect does not work

    let storyboard = UIStoryboard(name: "Main", bundle: nil)
    let protectionVC = storyboard.instantiateViewController(identifier: "PrivacyProtectionViewController")
    
    guard let windowScene = self.window?.windowScene else {
        return
    }
    
    privacyProtectionWindow = UIWindow(windowScene: windowScene)
    privacyProtectionWindow?.rootViewController = protectionVC
    UIView.transition(with: privacyProtectionWindow!, duration: 1.2, options: .transitionCrossDissolve, animations: nil, completion: nil)
    privacyProtectionWindow?.windowLevel = .alert + 1
    privacyProtectionWindow?.makeKeyAndVisible()

当我把它放到 SceneDelegate.swift 中的 sceneWillResignActive 函数时, 它根本不会影响我的过渡风格。

你知道为什么它不起作用吗?!

UIView.transition 方法将不起作用,因为您正在为 window 而不是正在屏幕上查看的控制器视图设置动画。你的动画持续时间(1.2秒)也太长了。

当用户退出当前场景时,iOS 动画出现的速度快于 1 秒。您可能会在应用程序之间切换时看到它,但当移动到主屏幕时,动画几乎会立即出现。

考虑到所有这些因素,您可以使用以下代码获得所需的结果。

privacyProtectionWindow = UIWindow(windowScene: windowScene)
privacyProtectionWindow?.rootViewController = protectionVC

privacyProtectionWindow?.windowLevel = UIWindow.Level.alert
privacyProtectionWindow?.makeKeyAndVisible()

// New animation code
protectionVC.view.alpha = 0.0
UIView.animate(withDuration: 0.2, delay: 0, options: [.curveEaseOut]) {
    protectionVC.view.alpha = 1.0
}

此外,为了更加流畅,您可以在场景再次激活时添加动画。

func sceneDidBecomeActive(_ scene: UIScene) {
    UIView.animate(withDuration: 0.2) {
        self.privacyProtectionWindow?.rootViewController!.view.alpha = 0.0
    } completion: { (completed) in
        if completed{
            self.privacyProtectionWindow = nil
            self.window?.makeKeyAndVisible()
        }
    }
}

alpha 值的动画改变 UIView 不透明度。它会给你你想要的效果 UIView.transition 方法。