外観を変更する要件は以下の3つかなと思います。
- アプリ全体で固定で適応する
- アプリ内で変更でき、変更をアプリ全体に適応する
- 画面単位で変更する
1. アプリ全体で固定で適応する
アプリ全体に固定の設定を適応させたい場合はinfo.plistに設定を記します。
info.plist
<key>UIUserInterfaceStyle</key>
<string>Automatic</string>
設定できる値はAutomatic
・Light
・Dark
の3種類です。Automatic
の場合はアプリのシステム設定に準拠します。
2. アプリ内で変更でき、変更をアプリ全体に適応する
アプリ内で動的に外観の設定を適応させることができます。その場合は以下のコードを記述するとアプリ全体に反映されます。
let scenes = UIApplication.shared.connectedScenes
let windowScene = scenes.first as? UIWindowScene
let window = windowScene?.windows.first
window?.overrideUserInterfaceStyle = .unspecified
設定できる値はunspecified
・light
・dark
の3種類です。unspecified
の場合はアプリのシステム設定に準拠します。
この実装はフレームのレンダリングが完了してから行う必要があるので、アプリで最初に表示されるViewの初期化の処理とかで行うと良いです。 つまりAppDelegate.didFinishLaunchingWithOptions
で設定しても反映されないです。
*フレームのレンダリング
3. 画面単位で変更する
アプリ全体の設定から特定の画面のみ変えたい場合はUIKitとSwiftUIで実装が異なります。
- UIKitの場合以下の実装をViewControllerで記述します。
設定できる値は上記同様にunspecified
・light
・dark
の3種類です。
overrideUserInterfaceStyle = .light
- SwiftUIの場合は以下の実装を設定を変更したい画面のトップのコンポーネントに記述します。
この場合VStack以下の画面に設定が適応されます。
設定できる値はnil
・light
・dark
の3種類です。nil
の場合はアプリのシステム設定に準拠します。
VStack {
}.preferredColorScheme(nil)