【问题标题】:Swift: If traitCollection.userInterfaceStyle == .unspecified, how do I determine if it's in light or dark mode?Swift:如果 traitCollection.userInterfaceStyle == .unspecified,我如何确定它是处于亮模式还是暗模式?
【发布时间】:2021-09-30 22:44:31
【问题描述】:

在我的应用设置中,用户可以在 3 种系统主题之间进行选择:浅色、深色或默认(与手机主题相匹配)。

我通过找到keyWindow 并将overrideUserInterfaceStyle = .dark 设置为暗模式,overrideUserInterfaceStyle = .light 设置为亮模式,将overrideUserInterfaceStyle = .unspecified 设置为默认值来做到这一点。

我遇到的问题是我在我的应用程序中使用 MapBox,并且我有一个 darkStyleURL 和一个 lightStyleURL。当用户选择一个主题时,我将样式 url 更新如下:

self.styleURL = self.traitCollection.userInterfaceStyle == .dark ? URL(string: darkStyleURL) : URL(string: lightStyleURL)

但是这样做的问题是如果用户选择 default 作为主题,traitCollection.userInterfaceStyle 将等于.unspecified。所以当上面的代码触发时,它会使用 lightStyleURL EVEN IF 用户的设备处于黑暗模式。

所以我的问题是,在设置overrideUserInterfaceStyle = .unspecified 之后,还有其他方法可以确定用户的设备主题吗?

或者有没有更好的方法来处理匹配设备主题或在所有三个选项之间切换的用例?任何帮助将不胜感激。谢谢!

【问题讨论】:

  • 为什么不只关注设备主题?为用户可能永远不会使用的功能增加应用的复杂性真的值得吗?
  • UITraitCollection.current.userInterfaceStyle
  • @Paulw11 这并不是问题的真正答案。谢谢,不取决于我。 Dudnyk 我会在星期一回来的时候试试这个,谢谢你的建议!
  • @EugeneDudnyk 效果很好,谢谢!

标签: ios swift ios-darkmode mapbox-ios


【解决方案1】:

您可以使用UIScreen.main.traitCollection.userInterfaceStyle 来获取当前设备主题,而不受窗口上覆盖的外观的影响。

【讨论】:

  • 将此标记为“正确”,尽管我使用的是 UITraitCollection.current.userInterfaceStyle 的 Eugene Dudnyks 答案。但它足够接近我相信两者都有效。感谢您的帮助!
猜你喜欢
  • 1970-01-01
  • 2014-07-13
  • 1970-01-01
  • 2014-10-02
  • 1970-01-01
  • 2013-10-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多