2
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

アプリ起動中にダークモード変更を検知する方法

Last updated at Posted at 2022-08-30

はじめに

外観モードによって分岐させる方法はよく見かけますが、
アプリ起動中に検知する方法をあまり見かけなかったので記事に残しておきます。
(あるけど、複雑だったり...)

外観モード変更を検知し、プロパティの値を分岐させる

初期設定

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名の方、ありがとうござました🙇‍♂️

2
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?