使用环境在整个视图层次结构中共享数据。
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
根据设备特性、系统状态或用户设置自动设置或更新许多环境值,如pixel
、scene
或locale
。对于其他,如line
,SwiftUI
提供了一个合理的默认值。
您可以使用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
小部件的渲染模式,基于系统显示的位置。