Swift 5:
traitCollectionDidChange also gets called a few times. This is how I detect DarkMode runtime change and setColors().
override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) {
super.traitCollectionDidChange(previousTraitCollection)
setColors()
}
In setColors() func I update the colors.
Detecting current colorScheme:
extension UIViewController {
var isDarkMode: Bool {
if #available(iOS 13.0, *) {
return self.traitCollection.userInterfaceStyle == .dark
}
else {
return false
}
}
}
I have colors defined like this (for iOS < 13):
enum ColorCompatibility {
static var myOlderiOSCompatibleColorName: UIColor {
if UIViewController().isDarkMode {
return UIColor(red: 33, green: 35, blue: 37, alpha: 0.85)
}
else {
return UIColor(hexString: "#F3F3F3", alpha: 0.85)
}
}
}
Example:
private func setColors() {
myView.backgroundColor = ColorCompatibility.myOlderiOSCompatibleColorName
}
Also you might need to call setColors in ViewDidLoad/Will/DidAppear depending on your case like this:
viewDidLoad() {
...
setColors()
...
}
For iOS11+ you could use “named Colors”, defined in Assets and much easier to use in IB.
Cheers