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

时间:2019-12-20 11:40:58

标签: ios swift xcode uikit uiscene

我通过在应用程序中调用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(_)。但是这些动作都没有在iPad模拟器上发生。

上面的代码仅在iPhone real / simulator上有效,在iPad simulator上也应该有效。我这里没有任何具有深色样式的iPad。

也许是模拟器上的错误?

我还尝试创建一个示例应用程序,并且样式更改确实可以在iPad上进行,但是由于它是一个干净的项目,没有任何库,因此应该可以工作。

我也在尝试最小化我的应用程序,但仍然无法正常工作,因此,如果它是造成冲突的图书馆,我会感到恐惧。

使用UIApplication而非UIScene设置时也会发生此问题。

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

1 个答案:

答案 0 :(得分:1)

如果使用自定义过渡,建议您在完成动画后设置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用户界面样式。