自分で用意したデータを処理する際に使用する@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:ColorSchemeContrast | ColorSchemeのコントラスト |
| 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: CGFloat | 1つのラインフラグメントの下部と次のラインフラグメントの上部の間のポイント単位の距離 |
| 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
コメント
[…] @Stateや@Environmentについてわからない場合は僕の過去の記事で説明しているので、読んでみてください。@State, @ObservedObject, @EnvironmentObject の使い分け – SwiftUI@EnvironmentでViewの環境値を読み取ろう-SwiftUI […]