ScrollView
一个用于可滚动内容的 SwiftUI ScrollView 组件。
iOS
tvOS
Included in Expo Go
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/uiIf 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 修饰器也适用于其他可滚动容器,例如 LazyVStack 和 LazyHStack。
对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
Type: React.Element<ScrollViewProps>