在 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 集合仅在某些方法中可用,例如 drawviewWillLayoutSubviews 等。

因此,例如,如果我在 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】:

您使用的颜色systemBackgroundlabel 实际上是动态颜色,当特征集合发生变化时会自动采用。 (好吧,在幕后,应用颜色的视图更有可能对特征环境变化做出反应并重新评估颜色。)这就是为什么在使用系统颜色时不需要手动执行任何操作的原因。

如果您希望自己的颜色具有相同的行为,您有两种选择:

您可以在资产目录中创建颜色集。在颜色集中,您可以为不同的外观定义不同的颜色(明暗模式和高对比度可访问性颜色)。您可以通过代码 (UIColor(named:)) 中设置的颜色名称来获取颜色,或者在界面生成器中使用它们。

或者,您可以在代码中创建颜色时使用动态提供程序块,您可以在其中根据特征集合确定实际颜色:

let color = UIColor  traitCollection -> UIColor in
    switch traitCollection.userInterfaceStyle 
        case .light, .unspecified: return .white
        case .dark: return .black
    

【讨论】:

以上是关于在 viewDidLoad 中使用动态颜色如何自动切换深色模式的颜色?的主要内容,如果未能解决你的问题,请参考以下文章

如何动态调整导航栏中的标题大小

长按如何使进度条变化Android

如何根据 UITextView 动态调整 xib 的大小

具有动态视图数量和自动布局 iOS6 的 UIScrollView

使用自动调整单元格设置UICollectionView后出现异常

如何动态更改球体对象的颜色(在 Autodesk forge 中使用 SceneBuilder)