提问人:guido 提问时间:10/20/2023 更新时间:10/20/2023 访问量:28
traitCollectionDidChange 在计划外观(深色模式/浅色模式)更改时未调用(例如在日落/日出时,或自定义时间表)
traitCollectionDidChange not called on scheduled appearance (dark mode / light mode) change (e.g. at sunset / sunrise, or custom schedule)
问:
我有一个导航应用程序。在导航会话期间,我防止屏幕进入睡眠状态。当用户在日出或日落前后开车/导航时,外观应在浅色和深色模式之间切换。
为了做到这一点,我创建了一个 UIWindow 的子类:
class WindowWithDarkModeMonitor: UIWindow {
override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) {
super.traitCollectionDidChange(previousTraitCollection)
print("traitCollectionDidChange")
}
}
traitCollectionDidChange
应该在特征(如纵向/横向和深色/浅色模式)发生变化时调用。(Apple 文档 (b.t.w.我知道这种方法将被弃用,但我的应用程序目前需要支持 iOS16,所以我仍然需要它)。
现在,问题是,没有在计划的外观更改上调用。当我通过控制中心在深色和浅色模式之间切换时,它被调用。当我旋转设备时,它也会被调用。traitCollectionDidChange
我浏览了很多,也尝试了很多,但找不到解决方案。这个 SO 问题很接近,但顶部(也是唯一)答案也不适用于我的情况。
经过一些测试,我实际上发现,我所知道的应用程序在计划更改时在前台处于活动状态时,不会从深色变为浅色,反之亦然。您可以自己尝试:
- 转到iOS设置>显示和亮度
- 将外观设置为“自动”,对于“选项”,选择“自定义计划”并选择时间,以便在 1 或 2 分钟后进行更改。
- 现在打开 Apple Mail、Safari 或任何其他支持深色模式的应用程序
- 确保您的显示器没有进入睡眠状态,并等到应该进行暗/亮切换的一分钟过去。
- 什么也没发生!!
- 只有在 iPhone 自动锁定或手动锁定并再次解锁后,才会应用暗/亮开关。
我有一种非常强烈的感觉,这要么是 iOS 错误(还是“功能”?无论如何,对于像我这样的应用程序来说,如果我不能在日落/日出时使用系统的自动暗/亮开关,那将是不幸的。我必须构建自己的解决方案来确定它是白天还是黑夜(基于位置和时区)。并非不可能,但我宁愿不重新发明轮子,并让我的应用程序尽可能接近系统行为。
那么,有没有办法让系统在计划的外观更改(暗/亮模式更改)时调用?或者,有任何其他方式可以收到有关此消息的通知?traitCollectionDidChange
答: 暂无答案
评论
traitCollectionDidChange