はじめに
外観モードによって分岐させる方法はよく見かけますが、
アプリ起動中に検知する方法をあまり見かけなかったので記事に残しておきます。
(あるけど、複雑だったり...)
外観モード変更を検知し、プロパティの値を分岐させる
初期設定
class ViewController: UIViewController {
let label = UILabel()
override func viewDidLoad() {
super.viewDidLoad()
label.text = UITraitCollection.current.userInterfaceStyle == .light ?
"ライトモードだよー" :
"ダークモードだよー"
}
}
外観モード変更の検知
class ViewController: UIViewController {
let label = UIlabel()
override func viewDidLoad() {
super.viewDidLoad()
label.text = UITraitCollection.current.userInterfaceStyle == .light ?
"ライトモードだよー" :
"ダークモードだよー"
}
// ↓↓追記
override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) {
super.traitCollectionDidChange(previousTraitCollection)
// 再度設定する
label.text = UITraitCollection.current.userInterfaceStyle == .light ?
"ライトモードだよー" :
"ダークモードだよー"
}
}
UIColorの対応(おまけ)
UIColor(dynamicProvider: )で定義する
class AppTheme {
static var primaryTextColor = UIColor { uiTraitCollection in
switch uiTraitCollection.userInterfaceStyle {
case .light:
return .blue
case .dark:
return .yellow
default:
return .blue
}
}
}
init(dynamicProvider:)でインスタンス化しておくと、
外観モードに変化があった際に自動で対応してくれるようです。
ViewController側でセット
class ViewController: UIViewController {
let label = UILabel()
override func viewDidLoad() {
super.viewDidLoad()
label.text = "hogehoge"
label.textColor = AppTheme.primaryTextColor
}
}
最後に
最後まで読んでいただきありがとうございました。
追記
記事の公開当初、UIColorの対応をアンチパターンで書いていました。
Twitterで指摘してくださった2名の方、ありがとうござました🙇♂️