Я использую 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, но и пользовательские значения. Как для определения цветов для разных тем, так и с помощью этого очень удобного способа реагирования на изменения.
Есть ли хороший способ получить доступ к пользовательским параметрам внутри этого замыкания?
РассматриваетсяОпции:
Доступ к UserDefaults внутри блока, чтобы проверить текущую используемую тему. -> Будет вызывать много запросов к UserDefaults при изменении TraitCollection.
Доступ к синглтону внутри блока для кэширования текущей используемой темы. -> Лучшая производительность, но за счет введения синглтона.
Измените статическую переменную UIColor на пользовательский поставщик цветов, используемый повсеместно для получения правильного цвета. -> Большое влияние на весь код пользовательского интерфейса.
Есть ли более простой способ, которого я здесь скучаю?