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
方法。
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
方法。