Как использование динамических c цветов в viewDidLoad автоматически переключает цвета в темный режим? - PullRequest
0 голосов
/ 11 февраля 2020

Согласно моему пониманию видео WWD C 2019 "Реализация темного режима в iOS", динамические цвета c разрешаются с использованием UITraitCollection.current. Обновленная коллекция черт готова только в определенных методах, таких как draw, viewWillLayoutSubviews et c.

Так что, если я использую цвета Dynami c внутри 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 Ответ

2 голосов
/ 11 февраля 2020

Используемые вами цвета systemBackground и label на самом деле динамические c цвета , которые автоматически изменяются при изменении набора признаков. (Хорошо, под капотом более вероятно, что представления, которые применяют цвета, реагируют на изменения окружения и повторно оценивают цвета.) Поэтому вам не нужно ничего делать вручную при использовании системных цветов.

Если вам нужно одинаковое поведение для ваших собственных цветов, у вас есть два варианта:

Вы можете создать набор цветов в каталоге активов. В наборах цветов вы можете определять разные цвета для разных видов (светлый и темный режим и высококонтрастные цвета доступности). Вы можете получить их по имени вашего цвета, заданного в коде (UIColor(named:)), или использовать их в конструкторе интерфейсов.

В качестве альтернативы, вы можете использовать блок поставщика динамического c при создании цвета в код, где вы можете определить фактический цвет на основе коллекции признаков:

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