在 viewDidLoad 中使用动态颜色如何自动切换深色模式的颜色?
Posted
技术标签:
【中文标题】在 viewDidLoad 中使用动态颜色如何自动切换深色模式的颜色?【英文标题】:How does using dynamic colors in viewDidLoad automatically switch the colors for Dark mode? 【发布时间】:2020-02-10 21:39:34 【问题描述】:根据我对 WWDC 2019 视频“在 ios 中实现暗模式”的理解,动态颜色使用 UITraitCollection.current
解决。更新后的 trait 集合仅在某些方法中可用,例如 draw
、viewWillLayoutSubviews
等。
因此,例如,如果我在 viewDidLoad 中使用动态颜色,则颜色不应在模式切换时自动更新。但是,它们正在更新
下面是我的代码:
class ViewController: UIViewController
override func viewDidLoad()
super.viewDidLoad()
// Do any additional setup after loading the view.
view.backgroundColor = .systemBackground
let label = UILabel(frame: CGRect(x: 100, y: 100, width: 100, height: 20))
label.textColor = UIColor.label
label.text = "Label text"
view.addSubview(label)
我在模拟器中切换模式的方式是设置->开发者->深色外观。然后我将我的应用程序带到了前台。
颜色是如何自动更新的?
注意:我没有在我的设备上进行测试。
【问题讨论】:
【参考方案1】:您使用的颜色systemBackground
和label
实际上是动态颜色,当特征集合发生变化时会自动采用。 (好吧,在幕后,应用颜色的视图更有可能对特征环境变化做出反应并重新评估颜色。)这就是为什么在使用系统颜色时不需要手动执行任何操作的原因。
如果您希望自己的颜色具有相同的行为,您有两种选择:
您可以在资产目录中创建颜色集。在颜色集中,您可以为不同的外观定义不同的颜色(明暗模式和高对比度可访问性颜色)。您可以通过代码 (UIColor(named:)
) 中设置的颜色名称来获取颜色,或者在界面生成器中使用它们。
或者,您可以在代码中创建颜色时使用动态提供程序块,您可以在其中根据特征集合确定实际颜色:
let color = UIColor traitCollection -> UIColor in
switch traitCollection.userInterfaceStyle
case .light, .unspecified: return .white
case .dark: return .black
【讨论】:
以上是关于在 viewDidLoad 中使用动态颜色如何自动切换深色模式的颜色?的主要内容,如果未能解决你的问题,请参考以下文章
具有动态视图数量和自动布局 iOS6 的 UIScrollView