弹出视图修饰符(Presentation
这些修饰符用于配置通过 sheet 呈现的视图的行为和外观,包括在不同尺寸环境下的适配方式、拖拽指示器、支持的尺寸(detents)、背景交互、滚动与调整优先级等。
这些修饰符应作用于 被 sheet 弹出显示的根视图(例如 <VStack>、<NavigationStack> 或 <List>)。
presentationCompactAdaptation
定义当设备处于 横向或纵向紧凑尺寸类(Compact Size Class) 时,sheet 的适配方式。
类型
1presentationCompactAdaptation?: PresentationAdaptation | {
2 horizontal: PresentationAdaptation
3 vertical: PresentationAdaptation
4}
PresentationAdaptation 可选值:
"automatic":系统默认行为
"fullScreenCover":使用全屏显示
"sheet":使用普通 sheet 弹出样式
"popover":使用气泡样式(部分平台支持)
"none":不进行适配(尽可能维持原样)
示例
1<NavigationStack
2 presentationCompactAdaptation={{
3 horizontal: "fullScreenCover",
4 vertical: "sheet"
5 }}
6>
7 {/* 弹出内容 */}
8</NavigationStack>
presentationDragIndicator
控制 sheet 顶部是否显示 拖拽指示器(即小横条)。
类型
1presentationDragIndicator?: "visible" | "hidden" | "automatic"
示例
1<VStack presentationDragIndicator="visible">
2 <Text>可以拖动顶部指示器来改变高度</Text>
3</VStack>
presentationDetents
定义 sheet 支持的 高度位置(detents),用户可以通过拖拽在这些高度间切换。
类型
1presentationDetents?: PresentationDetent[]
PresentationDetent 可选值:
"medium":大约为屏幕高度的一半(在紧凑纵向尺寸下无效)
"large":占满整个屏幕高度
number > 1:表示固定的高度(单位为 pt)
0 < number <= 1:表示按屏幕高度的百分比(例如 0.5 表示 50% 高度)
示例
1<VStack presentationDetents={[200, "medium", "large"]}>
2 <Text>拖动可在不同高度之间切换</Text>
3</VStack>
presentationBackgroundInteraction
定义在弹出页面显示时,用户是否可以与 底层视图交互。
类型
1presentationBackgroundInteraction?:
2 | "automatic"
3 | "enabled"
4 | "disabled"
5 | { enabledUpThrough: PresentationDetent }
示例:仅在 sheet 高度较小时允许背景交互
1<VStack presentationBackgroundInteraction={{
2 enabledUpThrough: "medium"
3}}>
4 <Text>当 sheet 为中等高度时,背景可交互</Text>
5</VStack>
presentationContentInteraction
控制在向上滑动手势中,sheet 是优先 调整高度 还是 滚动内容。
类型
1presentationContentInteraction?: "automatic" | "resizes" | "scrolls"
说明
"resizes":优先调整 detent 高度,滚动内容居后
"scrolls":立即滚动内部内容(如 ScrollView)
"automatic":系统默认行为(通常优先调整 detent)
示例
1<ScrollView presentationContentInteraction="scrolls">
2 {/* 向上滑时会立即滚动,而不会先调整 sheet 高度 */}
3</ScrollView>
presentationCornerRadius
设置 sheet 背景的 圆角半径。
类型
1presentationCornerRadius?: number
示例
1<VStack presentationCornerRadius={16}>
2 <Text>该 sheet 具有圆角背景</Text>
3</VStack>
完整使用示例
1function SheetPage({ onDismiss }: {
2 onDismiss: () => void
3}) {
4 return <NavigationStack>
5 <List navigationTitle="弹出页">
6 <Text font="title" padding={50}>
7 拖动指示器可改变 sheet 高度。
8 </Text>
9 <Button
10 title="关闭"
11 action={onDismiss}
12 />
13 </List>
14 </NavigationStack>
15}
16
17<Button
18 title="显示"
19 action={() => setIsPresented(true)}
20 sheet={{
21 isPresented: isPresented,
22 onChanged: setIsPresented,
23 content: <SheetPage
24 presentationDragIndicator="visible"
25 presentationDetents={[200, "medium", "large"]}
26 onDismiss={() => setIsPresented(false)}
27 />
28 }}
29/>
修饰符汇总
| 修饰符 |
功能说明 |
presentationCompactAdaptation |
设置在紧凑尺寸类下的适配方式 |
presentationDragIndicator |
控制是否显示拖拽指示器 |
presentationDetents |
定义 sheet 可拖拽的高度(支持多个) |
presentationBackgroundInteraction |
设置是否允许与背景内容交互 |
presentationContentInteraction |
控制是优先滚动还是优先调整高度 |
presentationCornerRadius |
设置 sheet 的圆角大小 |