Допустим, у меня есть собственный цвет в моем приложении:
extension UIColor {
static var myControlBackground: UIColor {
return UIColor(red: 0.3, green: 0.4, blue: 0.5, alpha: 1)
}
}
Я использую его в пользовательском элементе управления (и в других местах) в качестве фона элемента управления:
class MyControl: UIControl {
override init(frame: CGRect) {
super.init(frame: frame)
setup()
}
required init?(coder: NSCoder) {
super.init(coder: coder)
setup()
}
private func setup() {
backgroundColor = .myControlBackground
}
// Lots of code irrelevant to the question
}
СiOS 13, я хочу, чтобы мой пользовательский элемент управления поддерживал как светлый, так и темный режим.
Одно из решений - переопределить traitCollectionDidChange
и посмотреть, изменился ли цвет, а затем обновить свой фон при необходимости.Мне также нужно предоставить как светлый, так и темный цвет.
Поэтому я обновляю свои пользовательские цвета:
extension UIColor {
static var myControlBackgroundLight: UIColor {
return UIColor(red: 0.3, green: 0.4, blue: 0.5, alpha: 1)
}
static var myControlBackgroundDark: UIColor {
return UIColor(red: 0.4, green: 0.3, blue: 0.2, alpha: 1)
}
}
И я обновляю свой контрольный код:
extension MyControl {
override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) {
super.traitCollectionDidChange(previousTraitCollection)
if #available(iOS 13.0, *) {
if traitCollection.hasDifferentColorAppearance(comparedTo: previousTraitCollection) {
backgroundColor = traitCollection.userInterfaceStyle == .dark ?
.myControlBackgroundDark : .myControlBackgroundLight
}
}
}
}
Кажется, это работает, но это неуклюже, и везде, где я использую myControlBackground
, нужно добавить тот же код.
Есть ли лучшее решение для поддержки моего пользовательского цвета и управления как в светлом, так и в темном режиме?