使用環(huán)境在整個視圖層次結(jié)構(gòu)中共享數(shù)據(jù)。
SwiftUI
中的視圖可以使用Environment
屬性包裝器對它們從環(huán)境中讀取的配置信息做出響應(yīng)。視圖從其容器視圖繼承其環(huán)境,受environment(_:_:)
視圖修飾符的顯式更改,或受對環(huán)境值操作的眾多修飾符之一的隱式更改的影響。因此,您可以通過修改組容器的環(huán)境來配置整個視圖層次結(jié)構(gòu)。
您可以在Environment
結(jié)構(gòu)中找到許多內(nèi)置環(huán)境值。您還可以使用Environment
協(xié)議創(chuàng)建自定義值。
訪問環(huán)境值
struct Environment
從視圖環(huán)境中讀取值的屬性包裝器。
struct EnvironmentValues
通過視圖層次結(jié)構(gòu)傳播的環(huán)境值集合。
創(chuàng)建自定義環(huán)境值
protocol EnvironmentKey
訪問環(huán)境中值的關(guān)鍵。
改變環(huán)境
func environment<V>(WritableKeyPath<EnvironmentValues, V>, V) -> some View
將指定密鑰路徑的環(huán)境值設(shè)置為給定值。
func transformEnvironment<V>(WritableKeyPath<EnvironmentValues, V>, transform: (inout V) -> Void) -> some View
使用給定函數(shù)轉(zhuǎn)換指定鍵路徑的環(huán)境值。
Environment
從視圖環(huán)境中讀取值的屬性包裝器。
@frozen @propertyWrapper struct Environment<Value>
使用Environment
屬性包裝器讀取存儲在視圖環(huán)境中的值。在屬性聲明中使用Environment
鍵路徑指示要讀取的值。例如,您可以使用color屬性的關(guān)鍵路徑創(chuàng)建一個屬性來讀取當前視圖的配色方案:
@Environment(\.colorScheme) var colorScheme: ColorScheme
可以在關(guān)聯(lián)值上設(shè)置視圖的內(nèi)容,該值是從聲明屬性的wrappedValue
中讀取的。與任何屬性包裝器一樣,您可以通過直接引用屬性來訪問包裝的值:
if colorScheme == .dark { // Checks the wrapped value.
DarkContent()
} else {
LightContent()
}
如果值發(fā)生變化,SwiftUI會更新視圖中取決于值的任何部分。例如,如果用戶更改外觀設(shè)置,則在上述示例中可能會發(fā)生這種情況。
您可以使用此屬性包裝器讀取(但不能設(shè)置)環(huán)境值。SwiftUI根據(jù)系統(tǒng)設(shè)置自動更新一些環(huán)境值,并為其他環(huán)境值提供合理的默認值。您可以使用environment(::)視圖修飾符覆蓋其中一些,以及設(shè)置您定義的自定義環(huán)境值。
有關(guān)SwiftUI提供的環(huán)境值的完整列表,請參閱Environment結(jié)構(gòu)的屬性。有關(guān)創(chuàng)建自定義環(huán)境值的信息,請參閱Environment協(xié)議。
EnvironmentValues
通過視圖層次結(jié)構(gòu)傳播的環(huán)境值集合。
struct EnvironmentValues
SwiftUI在Environment
結(jié)構(gòu)中向應(yīng)用程序的視圖公開一組值。要從結(jié)構(gòu)中讀取值,請使用Environment
屬性包裝器聲明屬性,并指定值的鍵路徑。例如,您可以閱讀當前區(qū)域設(shè)置:
@Environment(\.locale) var locale: Locale
使用您聲明的屬性來動態(tài)控制視圖的布局。SwiftUI
根據(jù)設(shè)備特性、系統(tǒng)狀態(tài)或用戶設(shè)置自動設(shè)置或更新許多環(huán)境值,如pixel
、scene
或locale
。對于其他,如line
,SwiftUI
提供了一個合理的默認值。
您可以使用environment(_:_:)
視圖修飾符設(shè)置或覆蓋某些值:
MyView()
.environment(\.lineLimit, 2)
您設(shè)置的值會影響您修改的視圖的環(huán)境——包括其在視圖層次結(jié)構(gòu)中的后代——但僅限于您應(yīng)用不同的環(huán)境修飾符的程度。
SwiftUI
提供用于設(shè)置某些值的專用視圖修飾符,這通常使您的代碼更易于閱讀。例如,您應(yīng)該使用lineLimit(_:)
修飾符,而不是像上一個示例那樣直接設(shè)置line
值:
MyView()
.lineLimit(2)
在某些情況下,使用專用視圖修飾符會提供額外的功能。例如,您必須使用preferredScheme(_:)
修飾符,而不是直接設(shè)置color
,以確保在呈現(xiàn)彈出窗口等視圖時,新值會傳播到呈現(xiàn)的容器:
MyView()
.popover(isPresented: $isPopped) {
PopoverContent()
.preferredColorScheme(.dark)
}
通過定義符合Environment
協(xié)議的類型,然后使用新屬性擴展環(huán)境值結(jié)構(gòu)來創(chuàng)建自定義環(huán)境值。使用您的密鑰獲取和設(shè)置值,并提供專用修飾符供客戶端在設(shè)置值時使用:
private struct MyEnvironmentKey: EnvironmentKey {
static let defaultValue: String = "Default value"
}
extension EnvironmentValues {
var myCustomValue: String {
get { self[MyEnvironmentKey.self] }
set { self[MyEnvironmentKey.self] = newValue }
}
}
extension View {
func myCustomValue(_ myCustomValue: String) -> some View {
environment(\.myCustomValue, myCustomValue)
}
}
然后,您的值的客戶端以通常的方式訪問該值,使用Environment屬性包裝器讀取它,并使用my視圖修飾符進行設(shè)置。
創(chuàng)建和訪問價值
init()
創(chuàng)建一個環(huán)境值實例。
subscript<K>(K.Type) -> K.Value
訪問與自定義密鑰關(guān)聯(lián)的環(huán)境值。
var description: String
表示環(huán)境值實例內(nèi)容的字符串。
可訪問性
var accessibilityDifferentiateWithoutColor: Bool
是否啟用了無顏色區(qū)分的系統(tǒng)首選項。
var accessibilityEnabled: Bool
一個布爾值,指示用戶是否啟用了輔助技術(shù)。
var accessibilityInvertColors: Bool
是否啟用了反轉(zhuǎn)顏色的系統(tǒng)首選項。
var accessibilityLargeContentViewerEnabled: Bool
是否啟用了大型內(nèi)容查看器。
var accessibilityReduceMotion: Bool
是否啟用了減少運動的系統(tǒng)首選項。
var accessibilityReduceTransparency: Bool
是否啟用了降低透明度的系統(tǒng)首選項。
var accessibilityQuickActionsEnabled: Bool
一個布爾值,指示快速操作功能是否已啟用。
var accessibilityShowButtonShapes: Bool
顯示按鈕形狀的系統(tǒng)首選項是否已啟用。
var accessibilitySwitchControlEnabled: Bool
一個布爾值,指示開關(guān)控制電機輔助功能是否正在使用。
var accessibilityVoiceOverEnabled: Bool
一個布爾值,指示是否正在使用旁白屏幕閱讀器。
var legibilityWeight: LegibilityWeight?
適用于文本的字體權(quán)重。
行動
var dismiss: DismissAction
關(guān)閉當前演示文稿的操作。
var dismissSearch: DismissSearchAction
結(jié)束當前搜索交互的操作。
var newDocument: NewDocumentAction
在環(huán)境中呈現(xiàn)新文檔的行動。
var openDocument: OpenDocumentAction
在環(huán)境中呈現(xiàn)現(xiàn)有文檔的操作。
var openURL: OpenURLAction
打開URL的操作。
var openWindow: OpenWindowAction
存儲在視圖環(huán)境中的窗口演示操作。
var refresh: RefreshAction?
存儲在視圖環(huán)境中的刷新操作。
var rename: RenameAction?
激活標準重命名交互的操作。
var resetFocus: ResetFocusAction
請求焦點系統(tǒng)重新評估默認焦點的操作。
鑒定
var authorizationController: AuthorizationController
SwiftUI環(huán)境中提供的值,視圖可用于執(zhí)行授權(quán)請求。
var webAuthenticationSession: WebAuthenticationSession
在SwiftUI環(huán)境中提供的值,視圖可用于通過Web服務(wù)對用戶進行身份驗證。
控制和輸入
var controlSize: ControlSize
應(yīng)用于視圖中控件的大小。
var controlActiveState: ControlActiveState
視圖中控件的活動狀態(tài)。
var defaultWheelPickerItemHeight: CGFloat
輪式選擇器中項目的默認高度,例如日期選擇器。
var keyboardShortcut: KeyboardShortcut?
此環(huán)境中按鈕將觸發(fā)的鍵盤快捷鍵。
var menuIndicatorVisibility: Visibility
適用于視圖中控件的菜單指示器可見性。
var menuOrder: MenuOrder
此視圖中顯示的菜單項目的首選順序。
var searchSuggestionsPlacement: SearchSuggestionsPlacement
搜索建議的當前位置。
顯示特性
var colorScheme: ColorScheme
這種環(huán)境的配色方案。
var colorSchemeContrast: ColorSchemeContrast
與這種環(huán)境的配色方案相關(guān)的對比。
var displayScale: CGFloat
這種環(huán)境的顯示規(guī)模。
var horizontalSizeClass: UserInterfaceSizeClass?
這個環(huán)境的水平大小類。
var imageScale: Image.Scale
這個環(huán)境的圖像比例。
var pixelLength: CGFloat
屏幕上像素的大小。
var verticalSizeClass: UserInterfaceSizeClass?
這個環(huán)境的垂直大小類。
全球?qū)ο?/h4>
var calendar: Calendar
查看時應(yīng)使用的當前日歷。
var locale: Locale
視圖應(yīng)該使用的當前區(qū)域設(shè)置。
var managedObjectContext: NSManagedObjectContext
var timeZone: TimeZone
視圖在處理日期時應(yīng)使用的當前時區(qū)。
var undoManager: UndoManager?
撤銷管理器用于注冊視圖的撤銷操作。
滾動
var isScrollEnabled: Bool
一個布爾值,指示與此環(huán)境相關(guān)的任何滾動視圖是否允許滾動。
var horizontalScrollIndicatorVisibility: ScrollIndicatorVisibility
適用于任何水平可滾動內(nèi)容的滾動指示器的可見性。
var verticalScrollIndicatorVisibility: ScrollIndicatorVisibility
適用于任何垂直可滾動內(nèi)容的滾動指示器的可視化。
var scrollDismissesKeyboardMode: ScrollDismissesKeyboardMode
可滾動內(nèi)容與軟件鍵盤交互的方式。
var horizontalScrollBounceBehavior: ScrollBounceBehavior
可滾動視圖水平軸的滾動彈跳模式。
var verticalScrollBounceBehavior: ScrollBounceBehavior
可滾動視圖垂直軸的滾動跳動模式。
狀態(tài)
var editMode: Binding<EditMode>?
指示用戶是否可以編輯與此環(huán)境相關(guān)的視圖的內(nèi)容。
var isEnabled: Bool
一個布爾值,指示與此環(huán)境關(guān)聯(lián)的視圖是否允許用戶交互。
var isFocused: Bool
返回最近的可聚焦祖先是否有焦點。
var isLuminanceReduced: Bool
一個布爾值,指示顯示器或環(huán)境當前是否需要降低亮度。
var isPresented: Bool
一個布爾值,指示當前是否顯示與此環(huán)境關(guān)聯(lián)的視圖。
var isSearching: Bool
一個布爾值,指示用戶何時搜索。
var scenePhase: ScenePhase
場景的當前階段。
var supportsMultipleWindows: Bool
一個布爾值,指示當前平臺是否支持打開多個窗口。
StoreKit配置
var displayStoreKitMessage: DisplayMessageAction
var requestReview: RequestReviewAction
文本樣式
var allowsTightening: Bool
一個布爾值,指示字符間間距是否應(yīng)收緊以將文本放入可用空間。
var autocorrectionDisabled: Bool
一個布爾值,確定視圖層次結(jié)構(gòu)是否啟用了自動校正。
var dynamicTypeSize: DynamicTypeSize
當前的動態(tài)類型大小。
var font: Font?
此環(huán)境的默認字體。
var layoutDirection: LayoutDirection
與當前環(huán)境相關(guān)的布局方向。
var lineLimit: Int?
文本在視圖中可以占用的最大行數(shù)。
var lineSpacing: CGFloat
一條線碎片的底部和下一條線碎片的頂部之間的點距離。
var minimumScaleFactor: CGFloat
縮小字體大小以將文本放入可用空間的最低允許比例。
var multilineTextAlignment: TextAlignment
一個環(huán)境值,指示文本視圖在內(nèi)容包裝或包含換行符時如何對齊其行。
var textCase: Text.Case?
使用環(huán)境的區(qū)域設(shè)置,在顯示時轉(zhuǎn)換Text大小寫的風格覆蓋。
var truncationMode: Text.TruncationMode
一個值,指示布局如何截斷最后一行文本以適應(yīng)可用空間。
查看屬性
var backgroundMaterial: Material?
當前視圖下方的材料。
var backgroundStyle: AnyShapeStyle?
可選樣式,在設(shè)置時覆蓋默認系統(tǒng)背景樣式。
var contentTransition: ContentTransition
當前為視圖內(nèi)容制作動畫的方法。
var contentTransitionAddsDrawingGroup: Bool
一個布爾值,用于控制渲染內(nèi)容轉(zhuǎn)換的視圖是否使用GPU加速渲染。
var defaultMinListHeaderHeight: CGFloat?
列表中標題的默認最小高度。
var defaultMinListRowHeight: CGFloat
列表中行的默認最小高度。
var headerProminence: Prominence
適用于視圖中部分標題的突出值。
var redactionReasons: RedactionReasons
當前編輯原因應(yīng)用于視圖層次結(jié)構(gòu)。
var symbolRenderingMode: SymbolRenderingMode?
當前符號渲染模式,或nil表示使用當前圖像和前景樣式作為參數(shù)自動選擇該模式。
var symbolVariants: SymbolVariants
在此環(huán)境中使用的符號變體。
小部件
var showsWidgetLabel: Bool
一個布爾值,指示配件系列小部件是否可以顯示配件標簽。
var widgetFamily: WidgetFamily
小部件的模板——小、中或大。
var widgetRenderingMode: WidgetRenderingMode
小部件的渲染模式,基于系統(tǒng)顯示的位置。
var calendar: Calendar
查看時應(yīng)使用的當前日歷。
var locale: Locale
視圖應(yīng)該使用的當前區(qū)域設(shè)置。
var managedObjectContext: NSManagedObjectContext
var timeZone: TimeZone
視圖在處理日期時應(yīng)使用的當前時區(qū)。
var undoManager: UndoManager?
撤銷管理器用于注冊視圖的撤銷操作。
var isScrollEnabled: Bool
一個布爾值,指示與此環(huán)境相關(guān)的任何滾動視圖是否允許滾動。
var horizontalScrollIndicatorVisibility: ScrollIndicatorVisibility
適用于任何水平可滾動內(nèi)容的滾動指示器的可見性。
var verticalScrollIndicatorVisibility: ScrollIndicatorVisibility
適用于任何垂直可滾動內(nèi)容的滾動指示器的可視化。
var scrollDismissesKeyboardMode: ScrollDismissesKeyboardMode
可滾動內(nèi)容與軟件鍵盤交互的方式。
var horizontalScrollBounceBehavior: ScrollBounceBehavior
可滾動視圖水平軸的滾動彈跳模式。
var verticalScrollBounceBehavior: ScrollBounceBehavior
可滾動視圖垂直軸的滾動跳動模式。
var editMode: Binding<EditMode>?
指示用戶是否可以編輯與此環(huán)境相關(guān)的視圖的內(nèi)容。
var isEnabled: Bool
一個布爾值,指示與此環(huán)境關(guān)聯(lián)的視圖是否允許用戶交互。
var isFocused: Bool
返回最近的可聚焦祖先是否有焦點。
var isLuminanceReduced: Bool
一個布爾值,指示顯示器或環(huán)境當前是否需要降低亮度。
var isPresented: Bool
一個布爾值,指示當前是否顯示與此環(huán)境關(guān)聯(lián)的視圖。
var isSearching: Bool
一個布爾值,指示用戶何時搜索。
var scenePhase: ScenePhase
場景的當前階段。
var supportsMultipleWindows: Bool
一個布爾值,指示當前平臺是否支持打開多個窗口。
var displayStoreKitMessage: DisplayMessageAction
var requestReview: RequestReviewAction
var allowsTightening: Bool
一個布爾值,指示字符間間距是否應(yīng)收緊以將文本放入可用空間。
var autocorrectionDisabled: Bool
一個布爾值,確定視圖層次結(jié)構(gòu)是否啟用了自動校正。
var dynamicTypeSize: DynamicTypeSize
當前的動態(tài)類型大小。
var font: Font?
此環(huán)境的默認字體。
var layoutDirection: LayoutDirection
與當前環(huán)境相關(guān)的布局方向。
var lineLimit: Int?
文本在視圖中可以占用的最大行數(shù)。
var lineSpacing: CGFloat
一條線碎片的底部和下一條線碎片的頂部之間的點距離。
var minimumScaleFactor: CGFloat
縮小字體大小以將文本放入可用空間的最低允許比例。
var multilineTextAlignment: TextAlignment
一個環(huán)境值,指示文本視圖在內(nèi)容包裝或包含換行符時如何對齊其行。
var textCase: Text.Case?
使用環(huán)境的區(qū)域設(shè)置,在顯示時轉(zhuǎn)換Text大小寫的風格覆蓋。
var truncationMode: Text.TruncationMode
一個值,指示布局如何截斷最后一行文本以適應(yīng)可用空間。
var backgroundMaterial: Material?
當前視圖下方的材料。
var backgroundStyle: AnyShapeStyle?
可選樣式,在設(shè)置時覆蓋默認系統(tǒng)背景樣式。
var contentTransition: ContentTransition
當前為視圖內(nèi)容制作動畫的方法。
var contentTransitionAddsDrawingGroup: Bool
一個布爾值,用于控制渲染內(nèi)容轉(zhuǎn)換的視圖是否使用GPU加速渲染。
var defaultMinListHeaderHeight: CGFloat?
列表中標題的默認最小高度。
var defaultMinListRowHeight: CGFloat
列表中行的默認最小高度。
var headerProminence: Prominence
適用于視圖中部分標題的突出值。
var redactionReasons: RedactionReasons
當前編輯原因應(yīng)用于視圖層次結(jié)構(gòu)。
var symbolRenderingMode: SymbolRenderingMode?
當前符號渲染模式,或nil表示使用當前圖像和前景樣式作為參數(shù)自動選擇該模式。
var symbolVariants: SymbolVariants
在此環(huán)境中使用的符號變體。
var showsWidgetLabel: Bool
一個布爾值,指示配件系列小部件是否可以顯示配件標簽。
var widgetFamily: WidgetFamily
小部件的模板——小、中或大。
var widgetRenderingMode: WidgetRenderingMode
小部件的渲染模式,基于系統(tǒng)顯示的位置。