ios - 在 iPad 上使用 window.overrideUserInterfaceStyle 时暗模式未启用/禁用

标签 ios swift xcode uikit uiscene

我已通过在应用中调用 window.overrideUserInterfaceStyle 成功实现了暗模式切换。在真机或模拟器中运行该应用程序时,该功能运行良好。

但是当我在 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 用户界面风格。

关于ios - 在 iPad 上使用 window.overrideUserInterfaceStyle 时暗模式未启用/禁用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59424722/

相关文章:

ios - 在带有 Xcode 8 的 Objective C 中使用图表(BarChartDataEntry)iOS 库

ios - 处理 Collection View Cell 中元素的手势事件

ios - 在 swift 中使用 tableview 搜索 Controller 滚动

swift - 我可以将多个 Playground 文件放入一个 Xcode 工作簿吗?

objective-c - Xcode 无法发出预编译 header ?

objective-c - 如何在 Cocoa 中将 Finder Sync Extensions 与 Xcode 集成

ios - 在 NSString 中查找 char 连续出现的实例

ios - 使用 Xcode 在 iOS 上实现多点连接

swift - 在 swift 中与 NMSSH 作斗争;错误-2、-9、-18、

swift - Xcode 7.3、 swift 2.2 : default initialiser selector (new compile-time check)