traitCollectionDidChange 在计划外观(深色模式/浅色模式)更改时未调用(例如在日落/日出时,或自定义时间表)

traitCollectionDidChange not called on scheduled appearance (dark mode / light mode) change (e.g. at sunset / sunrise, or custom schedule)

提问人:guido 提问时间:10/20/2023 更新时间:10/20/2023 访问量:28

问:

我有一个导航应用程序。在导航会话期间,我防止屏幕进入睡眠状态。当用户在日出或日落前后开车/导航时,外观应在浅色和深色模式之间切换。

为了做到这一点,我创建了一个 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

iOS Swift iPhone DarkMode UITRAITCOLLECTION

评论

1赞 HangarRash 10/20/2023
您说得对,iOS 在屏幕关闭然后再次打开之前不会遵守计划的外观更改。这很奇怪,因为macOS没有这个“功能”。很多时候,我一直在使用我的 Mac,因为它在晚上切换到黑暗模式。不知道为什么 iOS 以不同的方式处理这个问题。但这意味着在模式实际更改之前(在屏幕关闭并再次打开之后)将无法调用。traitCollectionDidChange
0赞 HangarRash 10/20/2023
既然在设备锁定然后解锁之前,任何应用都不会改变外观,为什么你的应用需要在这方面与所有其他应用不同地处理这个问题?
0赞 guido 10/21/2023
这是一个有效的问题。很长一段时间以来,我确实只是遵循默认的 iOS 行为。随着时间的流逝,我收到了相当多的用户反馈。人们只是希望在日落时间骑车/开车时它会变为黑暗模式。我的应用程序也是一个摩托车导航应用程序。双手放在车把上,骑行时锁定/解锁设备既不容易也不安全。
0赞 guido 10/22/2023
骑摩托车时的另一个困难是,戴着头盔时,faceID无法正常工作,因此要解锁设备,您还必须输入密码。这是假设您戴着可触摸的手套。如果你不这样做,那么你必须找一个地方停下来,戴上手套来锁定和解锁你的设备。

答: 暂无答案