@EnvironmentでViewの環境値を読み取ろう-SwiftUI

Swift

自分で用意したデータを処理する際に使用する@Stateや@ObservedObjectとは違い、タイトルの通り、@EnvironmentはViewの環境値を読み取れるProperty Wrapperです。今回はこの@Environmentの使い方と読み取ることができる値について説明していきます。

使い方

それでは使い方です。今回は端末の外観モードの設定を取得し、ダークなら文字色を白に、ライトなら文字色を黒にするような処理を書いてみます。

struct ContentView: View {
    @Environment(\.colorScheme) var colorScheme: ColorScheme
    var body: some View {
        if colorScheme == .dark {
            Text("Hello")
                .foregroundColor(.white)
        } else if colorScheme == .light {
            Text("Hello")
                .foregroundColor(.black)
        }
    }
}

非常に簡単ですね。@Environment(.colorScheme) というようにkeyPathを指定することで colorScheme (= 外観モードの設定)を取得できます。

また、例えば上のContentViewを他の画面で呼び出す際に、ContentViewだけ常にダークモードにしておきたい、というような時には

ContentView()
    .environment(\.colorScheme, .dark)

と書くことでContentViewのcolorSchemeには必ず.darkが入るようになります。

読み取ることができる値

@Environmentで取得できる値はEnvironmentValueで定義されているものになります。

accessibilityDifferentiateWithoutColor: Boolシステム環境設定の「色を使わずに区別する」が
有効になっているかどうか
accessibilityEnabled: Boolユーザーアシスタントを使用しているかどうか
accessibilityInvertColors: Boolユーザーアシスタントの色反転を使用しているかどうか
accessibilityReduceMotion: Boolシステムの優先設定でモーションの軽減が有効になっているかどうか
accessibilityReduceTransparency: Bool透明度の削減のシステム環境設定が有効になっているかどうか
accessibilityShowButtonShapes: Bool[ボタンの形状を表示]のシステム環境設定が有効になっているかどうか
legibilityWeight: LegibilityWeight?テキストに適用するフォントの太さ
colorScheme:ColorScheme外観モードの設定 ダークモードかライトモードか
colorSchemeContrast:ColorSchemeContrastColorSchemeのコントラスト
controlSize:ControlSizeビュー内のコントロールに適用するサイズ
controlProminence: Prominenceビュー内のコントロールに適用するプロミネンス
controlActiveState: ControlActiveStateビュー内のコントロールのアクティブな状態
defaultWheelPickerItemHeight: CGFloat日付ピッカーなどのホイールスタイルピッカーのアイテムのデフォルトの高さ
headerProminence: Prominenceビュー内のセクションヘッダーに適用するプロミネンス
isEnabled: Boolこの環境に関連付けられたビューがユーザーの操作を許可するかどうかを示すBool値
menuIndicatorVisibility: Visibilityビュー内のコントロールに適用するメニューインジケーターの可視性
managedObjectContext: NSManagedObjectContext?
calendar: Calendar
ビューが日付を処理するときに使用する必要がある現在のカレンダー
locale: Localeビューが使用する必要がある現在のロケール
timeZone: TimeZoneビューが日付を処理するときに使用する必要がある現在のタイムゾーン
displayScale: CGFloatこの環境の表示スケール
imageScale: Image.Scaleこの環境の画像スケール
pixelLength: CGFloat画面上のピクセルのサイズ
isLuminanceReduced: Boolディスプレイに現在輝度を下げる必要があるかどうかを示すBool値
editMode: Binding?ユーザーがこの環境に関連付けられたビューのコンテンツを編集できるかどうかを示すモード
isFocused: Bool最も近いフォーカス可能な祖先にフォーカスがあるかどうかを返します(?)
resetFocus: ResetFocusActionデフォルトのフォーカスを再評価するようにフォーカスシステムに要求するアクション
keyboardShortcut: KeyboardShortcut?この環境のボタンがトリガーされるキーボードショートカット
defaultMinListHeaderHeight: CGFloat?リスト内のヘッダーのデフォルトの最小高さ
defaultMinListRowHeight: CGFloatリスト内の行のデフォルトの最小高さ
backgroundMaterial: Material?現在のビューの下にあるマテリアル
isPresented: Boolこの環境に関連付けられているビューが現在表示されているかどうかを示すBool値
dismiss: DismissAction現在のプレゼンテーションを閉じる際のアクション
redactionReasons: RedactionReasonsビュー階層に適用される現在の編集理由
refresh: RefreshAction?ビューの環境に保存されている更新アクション
scenePhase: ScenePhase現在のSceneのフェーズ
isSearching: Boolユーザーが現在、周囲の検索可能な修飾子によって配置された検索フィールドを操作しているかどうか
dismissSearch: DismissSearchAction現在の検索インタラクションを却下するようにシステムに要求します
horizontalSizeClass: UserInterfaceSizeClass?この環境の水平サイズクラス
verticalSizeClass: UserInterfaceSizeClass?この環境の垂直サイズクラス
symbolRenderingMode: SymbolRenderingMode?現在のシンボルレンダリングモード、またはnilは、現在の画像と前景スタイルをパラメータとして使用してモードが自動的に選択されることを示します
symbolVariants: SymbolVariantsこの環境で使用するシンボルバリアント
allowsTightening: Bool使用可能なスペースにテキストを収めるために文字間の間隔を狭める必要があるかどうかを示すBool値
disableAutocorrection: Bool?ビュー階層で自動修正が有効になっているかどうかを決定するBool値
dynamicTypeSize: DynamicTypeSize現在の動的タイプのサイズ
font: Font?この環境のデフォルトフォント
layoutDirection: LayoutDirection現在の環境に関連付けられているレイアウトの方向
lineLimit: Int?テキストがビューで占めることができる最大行数
lineSpacing: CGFloat1つのラインフラグメントの下部と次のラインフラグメントの上部の間のポイント単位の距離
minimumScaleFactor: CGFloat使用可能なスペースにテキストを収めるためにフォントサイズを縮小するための最小許容比率
multilineTextAlignment: TextAlignmentコンテンツが改行を折り返すか含むときに、テキストインスタンスがどのように行を揃えるかを示す値
textCase: Text.Case?環境のロケールを使用して、表示時にテキストの大文字と小文字を変換するための文体のオーバーライド
truncationMode: Text.TruncationModeレイアウトがテキストの最後の行を切り捨てて、使用可能なスペースに収まるようにする方法を示す値
undoManager: UndoManager?ビューの元に戻す操作を登録するために使用される元に戻すマネージャー
openURL: OpenURLAction適切なシステムサービスを使用してURLを開きます
widgetFamily: WidgetFamilyウィジェットのテンプレート—小、中、または大
description: String環境値インスタンスの内容を表す文字列

詳しくはAppleの公式ドキュメントを参照してください。https://developer.apple.com/documentation/swiftui/environmentvalues

コメント

  1. […] @Stateや@Environmentについてわからない場合は僕の過去の記事で説明しているので、読んでみてください。@State, @ObservedObject, @EnvironmentObject の使い分け – SwiftUI@EnvironmentでViewの環境値を読み取ろう-SwiftUI […]