SwiftUI-Environment values

使用環(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)境值,如pixelscenelocale。對于其他,如lineSwiftUI提供了一個合理的默認值。
您可以使用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)顯示的位置。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容