SwiftUI-Environment values

使用环境在整个视图层次结构中共享数据。

SwiftUI中的视图可以使用Environment属性包装器对它们从环境中读取的配置信息做出响应。视图从其容器视图继承其环境,受environment(_:_:)视图修饰符的显式更改,或受对环境值操作的众多修饰符之一的隐式更改的影响。因此,您可以通过修改组容器的环境来配置整个视图层次结构。
您可以在Environment结构中找到许多内置环境值。您还可以使用Environment协议创建自定义值。

访问环境值

struct Environment
从视图环境中读取值的属性包装器。
struct EnvironmentValues
通过视图层次结构传播的环境值集合。

创建自定义环境值

protocol EnvironmentKey
访问环境中值的关键。

改变环境

func environment<V>(WritableKeyPath<EnvironmentValues, V>, V) -> some View
将指定密钥路径的环境值设置为给定值。
func transformEnvironment<V>(WritableKeyPath<EnvironmentValues, V>, transform: (inout V) -> Void) -> some View
使用给定函数转换指定键路径的环境值。

Environment

从视图环境中读取值的属性包装器。

@frozen @propertyWrapper struct Environment<Value>

使用Environment属性包装器读取存储在视图环境中的值。在属性声明中使用Environment键路径指示要读取的值。例如,您可以使用color属性的关键路径创建一个属性来读取当前视图的配色方案:

@Environment(\.colorScheme) var colorScheme: ColorScheme

可以在关联值上设置视图的内容,该值是从声明属性的wrappedValue中读取的。与任何属性包装器一样,您可以通过直接引用属性来访问包装的值:

if colorScheme == .dark { // Checks the wrapped value.
    DarkContent()
} else {
    LightContent()
}

如果值发生变化,SwiftUI会更新视图中取决于值的任何部分。例如,如果用户更改外观设置,则在上述示例中可能会发生这种情况。

您可以使用此属性包装器读取(但不能设置)环境值。SwiftUI根据系统设置自动更新一些环境值,并为其他环境值提供合理的默认值。您可以使用environment(::)视图修饰符覆盖其中一些,以及设置您定义的自定义环境值。

有关SwiftUI提供的环境值的完整列表,请参阅Environment结构的属性。有关创建自定义环境值的信息,请参阅Environment协议。

EnvironmentValues

通过视图层次结构传播的环境值集合。

struct EnvironmentValues

SwiftUI在Environment结构中向应用程序的视图公开一组值。要从结构中读取值,请使用Environment属性包装器声明属性,并指定值的键路径。例如,您可以阅读当前区域设置:

@Environment(\.locale) var locale: Locale

使用您声明的属性来动态控制视图的布局。SwiftUI根据设备特性、系统状态或用户设置自动设置或更新许多环境值,如pixelscenelocale。对于其他,如lineSwiftUI提供了一个合理的默认值。
您可以使用environment(_:_:)视图修饰符设置或覆盖某些值:

MyView()
    .environment(\.lineLimit, 2)

您设置的值会影响您修改的视图的环境——包括其在视图层次结构中的后代——但仅限于您应用不同的环境修饰符的程度。

SwiftUI提供用于设置某些值的专用视图修饰符,这通常使您的代码更易于阅读。例如,您应该使用lineLimit(_:)修饰符,而不是像上一个示例那样直接设置line值:

MyView()
    .lineLimit(2)

在某些情况下,使用专用视图修饰符会提供额外的功能。例如,您必须使用preferredScheme(_:)修饰符,而不是直接设置color,以确保在呈现弹出窗口等视图时,新值会传播到呈现的容器:

MyView()
    .popover(isPresented: $isPopped) {
        PopoverContent()
            .preferredColorScheme(.dark)
    }

通过定义符合Environment协议的类型,然后使用新属性扩展环境值结构来创建自定义环境值。使用您的密钥获取和设置值,并提供专用修饰符供客户端在设置值时使用:

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视图修饰符进行设置。

创建和访问价值

init()
创建一个环境值实例。
subscript<K>(K.Type) -> K.Value
访问与自定义密钥关联的环境值。
var description: String
表示环境值实例内容的字符串。

可访问性

var accessibilityDifferentiateWithoutColor: Bool
是否启用了无颜色区分的系统首选项。
var accessibilityEnabled: Bool
一个布尔值,指示用户是否启用了辅助技术。
var accessibilityInvertColors: Bool
是否启用了反转颜色的系统首选项。
var accessibilityLargeContentViewerEnabled: Bool
是否启用了大型内容查看器。
var accessibilityReduceMotion: Bool
是否启用了减少运动的系统首选项。
var accessibilityReduceTransparency: Bool
是否启用了降低透明度的系统首选项。
var accessibilityQuickActionsEnabled: Bool
一个布尔值,指示快速操作功能是否已启用。
var accessibilityShowButtonShapes: Bool
显示按钮形状的系统首选项是否已启用。
var accessibilitySwitchControlEnabled: Bool
一个布尔值,指示开关控制电机辅助功能是否正在使用。
var accessibilityVoiceOverEnabled: Bool
一个布尔值,指示是否正在使用旁白屏幕阅读器。
var legibilityWeight: LegibilityWeight?
适用于文本的字体权重。

行动

var dismiss: DismissAction
关闭当前演示文稿的操作。
var dismissSearch: DismissSearchAction
结束当前搜索交互的操作。
var newDocument: NewDocumentAction
在环境中呈现新文档的行动。
var openDocument: OpenDocumentAction
在环境中呈现现有文档的操作。
var openURL: OpenURLAction
打开URL的操作。
var openWindow: OpenWindowAction
存储在视图环境中的窗口演示操作。
var refresh: RefreshAction?
存储在视图环境中的刷新操作。
var rename: RenameAction?
激活标准重命名交互的操作。
var resetFocus: ResetFocusAction
请求焦点系统重新评估默认焦点的操作。

鉴定

var authorizationController: AuthorizationController
SwiftUI环境中提供的值,视图可用于执行授权请求。
var webAuthenticationSession: WebAuthenticationSession
在SwiftUI环境中提供的值,视图可用于通过Web服务对用户进行身份验证。

控制和输入

var controlSize: ControlSize
应用于视图中控件的大小。
var controlActiveState: ControlActiveState
视图中控件的活动状态。
var defaultWheelPickerItemHeight: CGFloat
轮式选择器中项目的默认高度,例如日期选择器。
var keyboardShortcut: KeyboardShortcut?
此环境中按钮将触发的键盘快捷键。
var menuIndicatorVisibility: Visibility
适用于视图中控件的菜单指示器可见性。
var menuOrder: MenuOrder
此视图中显示的菜单项目的首选顺序。
var searchSuggestionsPlacement: SearchSuggestionsPlacement
搜索建议的当前位置。

显示特性

var colorScheme: ColorScheme
这种环境的配色方案。
var colorSchemeContrast: ColorSchemeContrast
与这种环境的配色方案相关的对比。
var displayScale: CGFloat
这种环境的显示规模。
var horizontalSizeClass: UserInterfaceSizeClass?
这个环境的水平大小类。
var imageScale: Image.Scale
这个环境的图像比例。
var pixelLength: CGFloat
屏幕上像素的大小。
var verticalSizeClass: UserInterfaceSizeClass?
这个环境的垂直大小类。

全球对象

var calendar: Calendar
查看时应使用的当前日历。
var locale: Locale
视图应该使用的当前区域设置。
var managedObjectContext: NSManagedObjectContext
var timeZone: TimeZone
视图在处理日期时应使用的当前时区。
var undoManager: UndoManager?
撤销管理器用于注册视图的撤销操作。

滚动

var isScrollEnabled: Bool
一个布尔值,指示与此环境相关的任何滚动视图是否允许滚动。
var horizontalScrollIndicatorVisibility: ScrollIndicatorVisibility
适用于任何水平可滚动内容的滚动指示器的可见性。
var verticalScrollIndicatorVisibility: ScrollIndicatorVisibility
适用于任何垂直可滚动内容的滚动指示器的可视化。
var scrollDismissesKeyboardMode: ScrollDismissesKeyboardMode
可滚动内容与软件键盘交互的方式。
var horizontalScrollBounceBehavior: ScrollBounceBehavior
可滚动视图水平轴的滚动弹跳模式。
var verticalScrollBounceBehavior: ScrollBounceBehavior
可滚动视图垂直轴的滚动跳动模式。

状态

var editMode: Binding<EditMode>?
指示用户是否可以编辑与此环境相关的视图的内容。
var isEnabled: Bool
一个布尔值,指示与此环境关联的视图是否允许用户交互。
var isFocused: Bool
返回最近的可聚焦祖先是否有焦点。
var isLuminanceReduced: Bool
一个布尔值,指示显示器或环境当前是否需要降低亮度。
var isPresented: Bool
一个布尔值,指示当前是否显示与此环境关联的视图。
var isSearching: Bool
一个布尔值,指示用户何时搜索。
var scenePhase: ScenePhase
场景的当前阶段。
var supportsMultipleWindows: Bool
一个布尔值,指示当前平台是否支持打开多个窗口。

StoreKit配置

var displayStoreKitMessage: DisplayMessageAction
var requestReview: RequestReviewAction

文本样式

var allowsTightening: Bool
一个布尔值,指示字符间间距是否应收紧以将文本放入可用空间。
var autocorrectionDisabled: Bool
一个布尔值,确定视图层次结构是否启用了自动校正。
var dynamicTypeSize: DynamicTypeSize
当前的动态类型大小。
var font: Font?
此环境的默认字体。
var layoutDirection: LayoutDirection
与当前环境相关的布局方向。
var lineLimit: Int?
文本在视图中可以占用的最大行数。
var lineSpacing: CGFloat
一条线碎片的底部和下一条线碎片的顶部之间的点距离。
var minimumScaleFactor: CGFloat
缩小字体大小以将文本放入可用空间的最低允许比例。
var multilineTextAlignment: TextAlignment
一个环境值,指示文本视图在内容包装或包含换行符时如何对齐其行。
var textCase: Text.Case?
使用环境的区域设置,在显示时转换Text大小写的风格覆盖。
var truncationMode: Text.TruncationMode
一个值,指示布局如何截断最后一行文本以适应可用空间。

查看属性

var backgroundMaterial: Material?
当前视图下方的材料。
var backgroundStyle: AnyShapeStyle?
可选样式,在设置时覆盖默认系统背景样式。
var contentTransition: ContentTransition
当前为视图内容制作动画的方法。
var contentTransitionAddsDrawingGroup: Bool
一个布尔值,用于控制渲染内容转换的视图是否使用GPU加速渲染。
var defaultMinListHeaderHeight: CGFloat?
列表中标题的默认最小高度。
var defaultMinListRowHeight: CGFloat
列表中行的默认最小高度。
var headerProminence: Prominence
适用于视图中部分标题的突出值。
var redactionReasons: RedactionReasons
当前编辑原因应用于视图层次结构。
var symbolRenderingMode: SymbolRenderingMode?
当前符号渲染模式,或nil表示使用当前图像和前景样式作为参数自动选择该模式。
var symbolVariants: SymbolVariants
在此环境中使用的符号变体。

小部件

var showsWidgetLabel: Bool
一个布尔值,指示配件系列小部件是否可以显示配件标签。
var widgetFamily: WidgetFamily
小部件的模板——小、中或大。
var widgetRenderingMode: WidgetRenderingMode
小部件的渲染模式,基于系统显示的位置。
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,539评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,911评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,337评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,723评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,795评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,762评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,742评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,508评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,954评论 1 308
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,247评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,404评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,104评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,736评论 3 324
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,352评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,557评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,371评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,292评论 2 352

推荐阅读更多精彩内容