0

我已经通过调用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,但由于它是一个没有库的干净项目,它应该可以工作。

我也在尝试最小化我的应用程序,但仍然无法正常工作,所以我担心它是否是一个库会造成冲突。

使用UIApplicationsetup 而不是UIScene.

我将 Xcode 11.3 和 Swift 5 与一些 Cocoapod 库一起使用。

4

1 回答 1

3

如果您使用自定义过渡,我建议您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

于 2019-12-20T16:48:24.713 回答