【问题标题】:Swift How can you reset the colors of all the subviews on a page?Swift 如何重置页面上所有子视图的颜色?
【发布时间】:2021-02-13 10:47:25
【问题描述】:

如何自动重置页面上所有子视图的颜色?

我正在定义暗模式颜色,如下所示:

    static let textColor: UIColor = UITraitCollection.current.userInterfaceStyle == .light ? .black : .white

如果用户在暗模式自动发生时打开了应用程序(基于用户的设置),那么颜色不会改变。您必须关闭应用并重新打开它才能看到暗模式。

如何自动重置页面上所有子视图的颜色?

这是我尝试过的:

 override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) {
    super.traitCollectionDidChange(previousTraitCollection)
    view.layoutSubviews()
    view.subviews.forEach {$0.layoutSubviews()}
}

LayoutSubviews 不会重置颜色。

有什么想法吗?

谢谢!

【问题讨论】:

  • 将此标记为重复 - 请参阅stackoverflow.com/questions/56435720/… 中的第二个代码 sn-p - 如果您提出不同的要求,我很乐意删除我的 dup 投票。 (1) 我没有在您的代码中看到对 .userInterfaceStyle 的检查。 (2) 应该不需要调用layoutSubviews,只需更改您需要的明暗,让操作系统完成工作。
  • 这没有帮助。检查是在颜色上。如何重置视图以便重新应用背景颜色?
  • 也许我还是不明白.....检查的是颜色?那不是光明或黑暗——这是别的什么?如果是这样,那您为什么要声明“深色模式颜色”并查看特征集合?请更具体一点。举一个更好的例子,一个可以重复的例子。

标签: swift ios-darkmode


【解决方案1】:

您需要使用动态颜色才能让它们自动适应。这里

UITraitCollection.current.userInterfaceStyle == .light ? .black : .white

您检查界面样式此时并设置颜色,但是当特征环境发生变化时,该代码不会自动重新评估。

相反,您可以使用其中一种系统颜色(如.background.label),它会自动适应暗/亮模式的变化。如果您想定义自己的,最简单的方法是使用资产目录。当您在那里添加颜色时,您可以分别定义它在明暗模式下的外观。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-11-18
    • 2018-01-18
    相关资源
    最近更新 更多