1
1

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.

【SwiftUI】アプリ内でダークモードに切り替える方法

Last updated at Posted at 2023-04-25

概要

アプリ開発をしていて、アプリ内の設定画面からライトモードやダークモードに切り替える機能が欲しくなりました。

そこで自分なりに調べた方法を簡単にまとめます。

筆者はSwift歴1年ちょっとの初学者です。よって間違ったコードや知識があるかもしれません。もし間違いを発見しましたら、ご指摘いただけると幸いです。

環境

  • M1 macOS Ventura 13.1
  • Xcode 14.3
  • Swift 5.8

動作

425.gif

実装例

AppearanceModeSetting

enum AppearanceModeSetting: Int {
    case followSystem = 0
    case lightMode = 1
    case darkMode = 2
    
    var colorScheme: ColorScheme? {
        switch self {
        case .followSystem:
            return .none
        case .lightMode:
            return .light
        case .darkMode:
            return .dark
        }
    }
}

ここでは見た目を設定するためのEnumを定義しています。
数値を持っているのは、後々@AppStorageで値を取得し、rawValueで指定するためです。

ColorScheme型は、ライトモードかダークモード化を指定するための型です。

テーマ変更画面

struct TheamConfigurationView: View {
    @AppStorage(wrappedValue: 0, "appearanceMode") var appearanceMode
    var body: some View {
        Form {
            Picker("Appearance Setting", selection: $appearanceMode) {
                Text("システムに合わせる")
                    .tag(0)
                Text("ライトモード")
                    .tag(1)
                Text("ダークモード")
                    .tag(2)
            }
            .pickerStyle(.inline)
        }
    }
}

この画面でライトモードかダークモードかを指定します。
この場合デフォルトはシステムに合わせるになっています。

App構造体

@main
struct MyApp_App: App {
    @AppStorage(wrappedValue: 0, "appearanceMode") var appearanceMode
    
    var body: some Scene {
        WindowGroup {
            ContentView()
                .preferredColorScheme(AppearanceModeSetting(rawValue: appearanceMode)?.colorScheme)
        }
    }
}

@AppStorageでInt型の値を取得して、preferredColorSchemeAppearenceSettingcolorShemeを指定しています。

まとめ

@AppStorageをうまく活用すれば、意外と簡単に実装できます。

個人的にはライトモードとダークモードは、アプリごとに設定したいので、この機能があるととても嬉しいと思います。

最後まで読んでいただきありがとうございました!😊

参考にした記事

↑コードの大枠はほとんどこちらの記事を参考にさせていただきました。
しかしこの記事のコードだとダークモードに切り替えた途端に画面が戻ってしまうため、その辺を本記事で修正しました。

1
1
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
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?