在 iPad 上使用 window.overrideUserInterfaceStyle 时,暗模式不会启用/禁用



我已经通过在应用程序中调用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的 UIViews 的颜色。也叫traitCollectionDidChange(_)。但是这些操作都没有在iPad模拟器上发生。

上面的代码仅适用于iPhone真实/模拟器,它也应该适用于iPad模拟器。我这里没有任何能够深色风格的iPad。

也许这是模拟器上的错误?

我还尝试创建一个示例应用程序,样式更改确实适用于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用户界面样式。

最新更新