【问题标题】:How does using dynamic colors in viewDidLoad automatically switch the colors for Dark mode?在 viewDidLoad 中使用动态颜色如何自动切换深色模式的颜色?
【发布时间】: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)
  }
}

我在模拟器中切换模式的方式是设置->开发者->深色外观。然后我将我的应用程序带到了前台。

颜色是如何自动更新的?

注意:我没有在我的设备上进行测试。

【问题讨论】:

    标签: ios-darkmode


    【解决方案1】:

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-01-21
      • 1970-01-01
      • 1970-01-01
      • 2019-08-17
      • 2022-11-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多