在 iPad 上使用 window.overrideUserInterfaceStyle 时,深色模式不是 enabling/disabling
Dark mode not enabling/disabling when using window.overrideUserInterfaceStyle on iPad
我已经通过在我的应用程序中调用 window.overrideUserInterfaceStyle
成功实现了暗模式切换。当 运行 在真实 iPhone 或模拟器中运行该应用程序时,该功能可以正常工作。
但是当我 运行 在 iPad 中使用相同的脚本时,只有 view.overrideUserInterfaceStyle
有效。如果我尝试使用 window.overrideUserInterfaceStyle
它不会更新特征集合(也不会调用 traitCollectionDidChange(_)
.
要改变我正在做的风格(风格从白色到深色):
UIApplication.shared.connectedScenes.forEach { (scene: UIScene) in
(scene.delegate as? SceneDelegate)?.window?.overrideUserInterfaceStyle = .dark //Just this one works on iPhone.
}
UIApplication.shared.delegate?.window??.overrideUserInterfaceStyle = .dark //Force
UIWindow.appearance().overrideUserInterfaceStyle = .dark //Force
执行上面的代码时,它应该替换所有配置为 UIColor
的浅色和深色样式的 UIView 的颜色。也叫traitCollectionDidChange(_)
。但是 none 这些操作发生在 iPad 模拟器上。
上面的代码只适用于 iPhone real/simulator,它应该也适用于 iPad 模拟器。我这里没有iPad可以做暗黑风格的
可能是模拟器的bug?
我还尝试创建一个示例应用程序,样式更改确实适用于 iPad,但由于它是一个没有库的干净项目,所以应该可以。
我也在尝试最小化我的应用程序,但仍然无法正常工作,所以我担心它是否是一个库造成了冲突。
使用 UIApplication
设置而不是 UIScene
时也会出现此问题。
我正在使用 Xcode 11.3 和 Swift 5 以及一些 Cocoapod 库。
如果您使用自定义转场,我建议您在完成动画后设置viewController.overrideUserInterfaceStyle = .unspecified
。
像这样:
if #available(iOS 13.0, *) {
viewController.overrideUserInterfaceStyle = .dark
}
UIView.animate(withDuration: defaultAnimationDuration, delay: 0, animations: {
//animate viewController
}, completion: { [weak self] _ in
if #available(iOS 13.0, *) {
viewController.overrideUserInterfaceStyle = .unspecified
}
})
这将使您的 UIViewController
遵循 UIWindow
用户界面风格。
我已经通过在我的应用程序中调用 window.overrideUserInterfaceStyle
成功实现了暗模式切换。当 运行 在真实 iPhone 或模拟器中运行该应用程序时,该功能可以正常工作。
但是当我 运行 在 iPad 中使用相同的脚本时,只有 view.overrideUserInterfaceStyle
有效。如果我尝试使用 window.overrideUserInterfaceStyle
它不会更新特征集合(也不会调用 traitCollectionDidChange(_)
.
要改变我正在做的风格(风格从白色到深色):
UIApplication.shared.connectedScenes.forEach { (scene: UIScene) in
(scene.delegate as? SceneDelegate)?.window?.overrideUserInterfaceStyle = .dark //Just this one works on iPhone.
}
UIApplication.shared.delegate?.window??.overrideUserInterfaceStyle = .dark //Force
UIWindow.appearance().overrideUserInterfaceStyle = .dark //Force
执行上面的代码时,它应该替换所有配置为 UIColor
的浅色和深色样式的 UIView 的颜色。也叫traitCollectionDidChange(_)
。但是 none 这些操作发生在 iPad 模拟器上。
上面的代码只适用于 iPhone real/simulator,它应该也适用于 iPad 模拟器。我这里没有iPad可以做暗黑风格的
可能是模拟器的bug?
我还尝试创建一个示例应用程序,样式更改确实适用于 iPad,但由于它是一个没有库的干净项目,所以应该可以。
我也在尝试最小化我的应用程序,但仍然无法正常工作,所以我担心它是否是一个库造成了冲突。
使用 UIApplication
设置而不是 UIScene
时也会出现此问题。
我正在使用 Xcode 11.3 和 Swift 5 以及一些 Cocoapod 库。
如果您使用自定义转场,我建议您在完成动画后设置viewController.overrideUserInterfaceStyle = .unspecified
。
像这样:
if #available(iOS 13.0, *) {
viewController.overrideUserInterfaceStyle = .dark
}
UIView.animate(withDuration: defaultAnimationDuration, delay: 0, animations: {
//animate viewController
}, completion: { [weak self] _ in
if #available(iOS 13.0, *) {
viewController.overrideUserInterfaceStyle = .unspecified
}
})
这将使您的 UIViewController
遵循 UIWindow
用户界面风格。