如何检测系统在 Swift 中何时更改深色/浅色模式?

How can I detect when the system changes dark/light mode in Swift?

提问人:CristianMoisei 提问时间:8/16/2023 更新时间:8/16/2023 访问量:124

问:

我知道有很多答案指向 traitCollectionDidChange,但是当视图控制器的 userInterfaceStyle 更改时将调用它,并且我想让用户在系统、浅色和深色模式之间进行选择,所以我正在覆盖我的视图控制器的 userInterfaceStyle 并转到设备的设置并打开深色/浅色模式不会调用 traitCollectionDidChange。有没有其他方法可以解决这个问题?我做错了吗?

当应用程序启动时,我可以检查 UIScreen.main.traitCollection.userInterfaceStyle,因此,如果有某种方法可以观察此属性的更改或使用通知,则可以这样做。但同样,也许我的做法是错误的,所以我将不胜感激任何建议。

Swift UIViageController DarkMode UITRAITCOLLECTION UIUuserInterfaceStyle

评论

1赞 HangarRash 8/16/2023
为什么您的应用提供自己的方式在浅色和深色模式之间切换?为什么不尊重设备的设置并完成呢?这将使您的应用程序像绝大多数应用程序一样工作,并使您的代码变得更加简单。你的应用是否有某些独特之处,即让用户能够将应用的外观与设备的外观分开更改是大多数用户都想要的功能?
1赞 matt 8/16/2023
“转到设备的设置并打开深色/浅色模式不会调用 traitCollectionDidChange” 是的,它会,对于最顶层的视图。
0赞 CristianMoisei 8/16/2023
嘿@HangarRash,最常见的选择实际上是给用户这 3 个选择。看看 Spark、Trello、Craft、ChatGPT 和许多其他产品。甚至 StackOverflow,一个网络应用程序,也提供“浅色”、“系统设置”和“深色”。这样做的原因是让用户拥有控制权。他们可能不喜欢特定应用程序的浅色或深色设计,他们可能更喜欢将其设置为某个主题。
1赞 matt 8/17/2023
然后制作一个更高级别的容器 vc,它不会覆盖,所以它确实听到了特征收集的变化!或者只是在窗口中检测它们。
1赞 matt 8/18/2023
当然,为什么不呢?虽然我个人会使用超级容器视图控制器,但这完全取决于你。

答:

-1赞 ProtocolGuy 8/16/2023 #1

您实际上可以使用以下方法,例如在您的中观察有关主题的变化。UIViewController

willTransition(to newCollection: UITraitCollection, with coordinator: UIViewControllerTransitionCoordinator)

评论

0赞 CristianMoisei 8/16/2023
谢谢,但恐怕这也不会被调用。所以我的根 vc 实现了下面的所有功能,然后如果我进入系统设置并从深色更改为浅色,它们都不会被调用,因为这个 vc 的特征被覆盖了,所以就它而言没有任何变化。ibb.co/c2NVRym