UIColor dynamicProvider dark mode с пользовательскими темами / параметрами - PullRequest
0 голосов
/ 30 сентября 2019

Я использую UIColor init с dynamicProvider для поддержки темного режима в iOS 13.

public init(dynamicProvider: @escaping (UITraitCollection) -> UIColor)

Он используется следующим образом и гарантирует, что пользовательский интерфейс обновляется всякий раз, когда режимизменено:

extension UIColor {
    static var customColor: UIColor {
        if #available(iOS 13, *) {
            return UIColor { (traitCollection: UITraitCollection) -> UIColor in
                if traitCollection.userInterfaceStyle == .dark {
                    return .black
                } else {
                    return .white
                }
            }
        } else {
            return .white
        }
    }
}

Теперь я хотел бы иметь возможность поддерживать не только .dark / .light, но и пользовательские значения. Как для определения цветов для разных тем, так и с помощью этого очень удобного способа реагирования на изменения.

Есть ли хороший способ получить доступ к пользовательским параметрам внутри этого замыкания?

РассматриваетсяОпции:

  1. Доступ к UserDefaults внутри блока, чтобы проверить текущую используемую тему. -> Будет вызывать много запросов к UserDefaults при изменении TraitCollection.

  2. Доступ к синглтону внутри блока для кэширования текущей используемой темы. -> Лучшая производительность, но за счет введения синглтона.

  3. Измените статическую переменную UIColor на пользовательский поставщик цветов, используемый повсеместно для получения правильного цвета. -> Большое влияние на весь код пользовательского интерфейса.

Есть ли более простой способ, которого я здесь скучаю?

...