Я создавал метод в расширении UIView, и мне нужно было изменить UIColor в соответствии с UIUserInterfaceStyle, т.е. отдельный UIColor для интерфейса темного и светлого режимов.
Обычно в методе
UIViewController
классаtraitCollectionDidChange
срабатывает всякий раз, когда изменяется UIUserInterfaceStyle, и мы можем определить текущий стиль пользовательского интерфейса,
override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) {
super.traitCollectionDidChange(previousTraitCollection)
DispatchQueue.main.async { [weak self] in
guard let self = self else { return }
self.changeUIWithUserInterface(style: self.traitCollection.userInterfaceStyle)
}
}
Но расширение UIView не имеет метода traitCollectionDidChange, который можно запустить.
так как я могу изменить UIColor в соответствии с UIUserInterfaceStyle в расширении UIView?
Я понял это и решил опубликовать это для коллег-разработчиков.
Надеюсь, поможет :)
Метод changeUIWithUserInterface изменяет пользовательский интерфейс всякий раз, когда он вызывается, поэтому я поместил его в DispatchQueue.main.., я что-то здесь упускаю, @baronfac
Да. Он всегда будет вызываться в основном потоке
Метод ниже работает как шарм для меня!
Он срабатывает всякий раз, когда traitCollection
изменяется..
Он может работать с любым расширением различных компонентов пользовательского интерфейса.
UIColor.init { (trait) -> UIColor in
return trait.userInterfaceStyle == .dark ? darkModeColor : lightModeColor
}
Вы должны проверить iOS 13+, если вы работаете с поддержкой версий iOS ниже 13, что вы можете легко проверить
if #available(iOS 13.0, *) {
//Dark mode is supported
self.backgroundColor = UIColor.init { (trait) -> UIColor in
return trait.userInterfaceStyle == .dark ? darkModeColor : lightModeColor
}
} else {
//Earlier version of iOS, which does not suppport dark mode.
self.backgroundColor = lightModeColor
}
Вы можете установить UIColor как простую переменную, которая автоматически изменяется при изменении traitCollection
:
struct ColorPalette {
public static var subtitleColor: UIColor = {
if #available(iOS 13, *) {
return UIColor { (UITraitCollection: UITraitCollection) -> UIColor in
if UITraitCollection.userInterfaceStyle == .dark {
return UIColor.lightText
} else {
return .darkGray
}
}
} else {
/// Return a fallback color for iOS 12 and lower.
return .darkGray
}
}()
}
Использование:
label.textColor = ColorPalette.subtitleColor
Да, сэр, вы правы, но это следующий шаг, моя проблема заключалась в том, что я не могу изменить цвет в методе, созданном в расширении UIView... вы также используете то же самое (метод инициализации UIColor с traitcollection)..который я не знал о ... так что подумал, что это может помочь парню ... в любом случае спасибо, что поделились!
Почему вы используете DispatchQueue для UI-Work? Не имеет никакого смысла