Reference version

ScrollView

一个用于可滚动内容的 SwiftUI ScrollView 组件。

iOS
tvOS
Included in Expo Go
Bundled version:
~56.0.6

For the complete documentation index, see llms.txt. Use this file to discover all available pages.

有关跨平台用法,请参见通用的 ScrollView — 它会为每个平台渲染相应的原生组件。

Expo UI ScrollView 与官方 SwiftUI ScrollView API 保持一致,并为其子元素提供一个可滚动容器。

安装

Terminal
npx expo install @expo/ui

If you are installing this in an existing React Native app, make sure to install expo in your project.

用法

基础垂直滚动视图

一个简单的可垂直滚动文本列表。

ScrollViewVerticalExample.tsx
import { Host, ScrollView, VStack, Text } from '@expo/ui/swift-ui'; import { padding } from '@expo/ui/swift-ui/modifiers'; export default function ScrollViewVerticalExample() { return ( <Host style={{ flex: 1 }}> <ScrollView> <VStack spacing={8}> {Array.from({ length: 30 }, (_, i) => ( <Text key={i} modifiers={[padding({ horizontal: 16 })]}> {`项目 ${i + 1}`} </Text> ))} </VStack> </ScrollView> </Host> ); }

水平滚动视图

使用 axes 属性进行水平滚动。

ScrollViewHorizontalExample.tsx
import { Host, ScrollView, HStack, RoundedRectangle } from '@expo/ui/swift-ui'; import { frame, foregroundStyle } from '@expo/ui/swift-ui/modifiers'; export default function ScrollViewHorizontalExample() { return ( <Host style={{ flex: 1 }}> <ScrollView axes="horizontal"> <HStack spacing={8}> {Array.from({ length: 20 }, (_, i) => ( <RoundedRectangle key={i} cornerRadius={12} modifiers={[ frame({ width: 100, height: 100 }), foregroundStyle(`hsl(${i * 18}, 70%, 50%)`), ]} /> ))} </HStack> </ScrollView> </Host> ); }

隐藏滚动指示器

showsIndicators 设为 false 以隐藏滚动条。

ScrollViewHiddenIndicatorsExample.tsx
import { Host, ScrollView, VStack, Text } from '@expo/ui/swift-ui'; export default function ScrollViewHiddenIndicatorsExample() { return ( <Host style={{ flex: 1 }}> <ScrollView showsIndicators={false}> <VStack spacing={8}> {Array.from({ length: 30 }, (_, i) => ( <Text key={i}>{`项目 ${i + 1}`}</Text> ))} </VStack> </ScrollView> </Host> ); }

共享滚动位置

需要 iOS 17 或更高版本。在较旧版本上,该修饰器不会产生任何效果。

从 JavaScript 跟踪最前面的滚动目标 id,并通过写入状态来滚动到目标。使用 id 修饰器标记每个滚动目标,将内容容器包裹在 scrollTargetLayout 中,并将 scrollPosition 修饰器应用到 ScrollView。可选的 onChange 回调会在最前面的目标发生变化时在 JS 线程上触发。

scrollPosition 修饰器也适用于其他可滚动容器,例如 LazyVStackLazyHStack

state.value 的写入必须在 UI 运行时中执行。请使用 react-native-worklets 中的 scheduleOnUI 包装写入,或者从 'worklet' 函数内部调用它们。来自 JS 运行时的写入会触发 Main Thread Checker,这是 Xcode 的运行时工具,用于标记在后台线程上调用的 UIKit 操作。
ScrollViewSharedPositionExample.tsx
import { Button, Host, ScrollView, Text, VStack, useNativeState } from '@expo/ui/swift-ui'; import { id, padding, scrollPosition, scrollTargetLayout } from '@expo/ui/swift-ui/modifiers'; import { scheduleOnUI } from 'react-native-worklets'; export default function ScrollViewSharedPositionExample() { const activeID = useNativeState<string | null>(null); return ( <Host style={{ flex: 1 }}> <VStack spacing={12}> <ScrollView modifiers={[ scrollPosition(activeID, { onChange: newID => { console.log('[JS 线程] 最前面的目标:', newID); }, }), ]}> <VStack modifiers={[scrollTargetLayout()]}> {Array.from({ length: 30 }, (_, i) => ( <Text key={`item-${i}`} modifiers={[id(`item-${i}`), padding({ horizontal: 16, vertical: 12 })]}> {`项目 ${i}`} </Text> ))} </VStack> </ScrollView> <Button label="从 worklet 滚动到项目 10" onPress={() => { scheduleOnUI(() => { 'worklet'; activeID.value = 'item-10'; }); }} /> </VStack> </Host> ); }

API

import { ScrollView } from '@expo/ui/swift-ui';

Component

ScrollView

iOS
tvOS

Type: React.Element<ScrollViewProps>

ScrollViewProps

axes

iOS
tvOS
Optional • Literal type: string • Default: 'vertical'

The scrollable axes.

Acceptable values are: 'vertical' | 'horizontal' | 'both'

children

iOS
tvOS
Type: React.ReactNode

showsIndicators

iOS
tvOS
Optional • Type: boolean • Default: true

Whether to show scroll indicators.