iOS 13 暗黑模式:traitCollectionDidChange 只在第一次调用

7
我的应用程序使用自定义颜色主题,但iOS13用户可以选择进入深色模式。
我认为我可以简单地在ViewController的traitCollectionDidChange()中更新我的颜色,但由于某种原因,此函数仅在用户第一次更改iOS设置界面样式时调用。 尽管这对大多数用户来说可能已经足够,但理想情况下,每次用户更改其iOS设置时都应调用traitCollectionDidChange()
非常基础:
override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) {
  super.traitCollectionDidChange(previousTraitCollection)
  print(#function)

  guard traitCollection.userInterfaceStyle != previousTraitCollection?.userInterfaceStyle else { return }

  NotificationCenter.default.post(name: NSNotification.Name(Keys.Notifications.updateColorTheme), object: nil)
}

我打开我的应用程序,然后离开它,在iOS设置中更改外观:下次我打开应用程序时(是打开而不是启动),上述函数将被调用并更新应用程序的颜色。 现在,当我重复相同的过程时,该函数不再被调用。


2
有点不相关,但你的代码假定 traitCollectionDidChange 只在浅色/深色模式更改时被调用。实际上,traitCollectionDidChange 会因为很多原因而被调用。你应该检查浅色/深色模式是否发生了变化,这样你才能在适当的时候调用你的通知。 - rmaddy
@rmaddy,感谢您指出这一点。我已经简化了示例代码,但确实应该包含在内。我已经更新了我的帖子。只是为了任何阅读此内容并想知道的人,这个函数也会在设备旋转时被调用。 - nontomatic
@nontomatic,你找到任何关于为什么它没有在深色模式更改时被调用的真正解决方案了吗?我也遇到了同样的问题 - 它会在字体大小更改或其他事情上被调用,但并不总是在浅色/深色模式上。 - Chris Paveglio
我还让另一个开发人员在Info.plist文件中将应用程序主题硬编码为Light。糟糕! - Chris Paveglio
@Chirs Paveglio 没有,我没有。不过,我成功让我的应用程序正确响应深色模式设置。虽然已经过了一段时间,但我记得通过在appWillEnterForeground中发布通知来更新颜色主题。 - nontomatic
2个回答

5

我发现如果设置UIViewController的overrideUserInterfaceStyle属性,那么traitCollectionDidChange方法不会被调用,但是当我不设置这个overrideUserInterfaceStyle属性时,traitCollectionDidChange会被调用。

可能UIKit中有一些基于overrideUserInterfaceStyle属性的内部方法调用判断。

希望这可以帮到你。


0

overrideUserInterfaceStyle 的默认值为 .unspecified。如果您想再次调用它,只需在设置为 .light.dark 后将其恢复为 .unspecified


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接