跳到主要内容

ScrollView

组件,用于包裹平台 ScrollView,同时提供与触摸锁定“响应者”系统的集成。

请记住,ScrollView 必须具有有界高度才能工作,因为它们将无界高度的子组件包含到有界容器中(通过滚动交互)。为了限制 ScrollView 的高度,可以直接设置视图的高度(不建议),或者确保所有父视图都具有有界高度。忘记将 {flex: 1} 向下传递到视图堆栈可能会导致此处出现错误,元素检查器可以快速调试这些错误。

尚不支持阻止此滚动视图成为响应者的其他包含的响应者。

<ScrollView> vs <FlatList> - 应该使用哪一个?

ScrollView 一次性渲染其所有 React 子组件,但这会带来性能上的缺点。

想象一下,您有一个非常长的项目列表要显示,可能有好几个屏幕的内容。一次性为所有内容(其中大部分甚至可能不会显示)创建 JS 组件和原生视图,将导致渲染缓慢和内存使用增加。

这就是 FlatList 发挥作用的地方。FlatList 在项目即将出现时才延迟渲染它们,并移除滚动到屏幕外很远的项目,以节省内存和处理时间。

如果您想在项目之间渲染分隔符、多列、无限滚动加载或它开箱即用的任何其他功能,FlatList 也非常方便。

示例


参考

Props

View Props

继承自 View Props


StickyHeaderComponent

一个 React 组件,将用于渲染粘性标题,应与 stickyHeaderIndices 一起使用。如果您的粘性标题使用自定义转换,例如,当您希望列表具有动画和可隐藏的标题时,您可能需要设置此组件。如果未提供组件,则将使用默认的 ScrollViewStickyHeader 组件。

类型
component, element

alwaysBounceHorizontal
iOS

为 true 时,即使内容小于滚动视图本身,滚动视图在到达水平方向的末端时也会反弹。

类型默认值
boolhorizontal={true} 时为 true
否则为 false

alwaysBounceVertical
iOS

为 true 时,即使内容小于滚动视图本身,滚动视图在到达垂直方向的末端时也会反弹。

类型默认值
boolvertical={true} 时为 false
否则为 true

automaticallyAdjustContentInsets
iOS

控制 iOS 是否应自动调整放置在导航栏或标签栏/工具栏后面的滚动视图的内容插contentInset。

类型默认值
booltrue

automaticallyAdjustKeyboardInsets
iOS

控制当键盘更改大小时,ScrollView 是否应自动调整其 contentInsetscrollViewInsets

类型默认值
boolfalse

automaticallyAdjustsScrollIndicatorInsets
iOS

控制 iOS 是否应自动调整滚动指示器插contentInset。请参阅 Apple 关于此属性的文档

类型默认值
booltrue

bounces
iOS

为 true 时,如果内容沿滚动方向的轴线大于滚动视图,则滚动视图在到达内容末端时会反弹。当 false 时,即使 alwaysBounce* props 为 true,也会禁用所有反弹。

类型默认值
booltrue

bouncesZoom
iOS

true 时,手势可以驱动缩放超过最小/最大值,并且缩放将在手势结束时动画到最小/最大值,否则缩放将不会超过限制。

类型默认值
booltrue

canCancelContentTouches
iOS

false 时,一旦跟踪开始,如果触摸移动,将不会尝试拖动。

类型默认值
booltrue

centerContent
iOS

true 时,当内容小于滚动视图边界时,滚动视图会自动将内容居中;当内容大于滚动视图时,此属性不起作用。

类型默认值
boolfalse

contentContainerStyle

这些样式将应用于包裹所有子视图的滚动视图内容容器。示例

return (
<ScrollView contentContainerStyle={styles.contentContainer}>
</ScrollView>
);
...
const styles = StyleSheet.create({
contentContainer: {
paddingVertical: 20
}
});
类型
View Style

contentInset
iOS

滚动视图内容从滚动视图边缘插入的量。

类型默认值
object: {top: number, left: number, bottom: number, right: number}{top: 0, left: 0, bottom: 0, right: 0}

contentInsetAdjustmentBehavior
iOS

此属性指定如何使用安全区域插contentInset来修改滚动视图的内容区域。在 iOS 11 及更高版本上可用。

类型默认值
enum('automatic', 'scrollableAxes', 'never', 'always')'never'

contentOffset

用于手动设置起始滚动偏移量。

类型默认值
Point{x: 0, y: 0}

decelerationRate

一个浮点数,用于确定用户抬起手指后滚动视图减速的速度。您也可以使用字符串快捷方式 "normal""fast",它们分别与 UIScrollViewDecelerationRateNormalUIScrollViewDecelerationRateFast 的底层 iOS 设置匹配。

  • 'normal' 在 iOS 上为 0.998,在 Android 上为 0.985。
  • 'fast',在 iOS 上为 0.99,在 Android 上为 0.9。
类型默认值
enum('fast', 'normal'), number'normal'

directionalLockEnabled
iOS

为 true 时,ScrollView 将尝试在拖动时仅锁定为垂直或水平滚动。

类型默认值
boolfalse

disableIntervalMomentum

为 true 时,无论手势有多快,滚动视图都会在下一个索引处停止(相对于释放时的滚动位置)。当页面小于水平 ScrollView 的宽度或垂直 ScrollView 的高度时,这可以用于分页。

类型默认值
boolfalse

disableScrollViewPanResponder

为 true 时,ScrollView 上的默认 JS pan responder 被禁用,并且对 ScrollView 内部触摸的完全控制权留给其子组件。如果启用了 snapToInterval,这将特别有用,因为它不遵循典型的触摸模式。不要在没有 snapToInterval 的常规 ScrollView 用例中使用它,因为它可能会在滚动时导致意外的触摸发生。

类型默认值
boolfalse

endFillColor
Android

有时滚动视图占用的空间大于其内容填充的空间。在这种情况下,此 prop 将用颜色填充滚动视图的其余部分,以避免设置背景和创建不必要的过度绘制。这是一种高级优化,在一般情况下不需要。

类型
color

fadingEdgeLength
Android

淡出滚动内容的边缘。

如果该值大于 0,则将根据当前的滚动方向和位置设置淡出边缘,指示是否还有更多内容要显示。

类型默认值
number0

horizontal

true 时,滚动视图的子组件水平排列成行,而不是垂直排列成列。

类型默认值
boolfalse

indicatorStyle
iOS

滚动指示器的样式。

  • 'default'black 相同。
  • 'black',滚动指示器为 black。此样式适用于浅色背景。
  • 'white',滚动指示器为 white。此样式适用于深色背景。
类型默认值
enum('default', 'black', 'white')'default'

invertStickyHeaders

粘性标题是否应粘在 ScrollView 的底部而不是顶部。这通常与倒置的 ScrollView 一起使用。

类型默认值
boolfalse

keyboardDismissMode

确定是否应响应拖动手势来关闭键盘。

  • 'none',拖动不会关闭键盘。
  • 'on-drag',在拖动开始时关闭键盘。

仅限 iOS

  • 'interactive',键盘与拖动交互式地关闭,并与触摸同步移动,向上拖动会取消关闭。在 Android 上不支持此功能,其行为将与 'none' 相同。
类型默认值
enum('none', 'on-drag')
Android

enum('none', 'on-drag', 'interactive')
iOS
'none'

keyboardShouldPersistTaps

确定在点击后键盘应保持可见的时间。

  • 'never' 当键盘弹出时,点击聚焦文本输入框外部会关闭键盘。发生这种情况时,子组件将不会收到点击事件。
  • 'always',键盘不会自动关闭,并且滚动视图不会捕获点击事件,但滚动视图的子组件可以捕获点击事件。
  • 'handled',当点击事件被滚动视图的子组件处理(或被祖先捕获)时,键盘不会自动关闭。
  • false已弃用,请改用 'never'
  • true已弃用,请改用 'always'
类型默认值
enum('always', 'never', 'handled', false, true)'never'

maintainVisibleContentPosition

设置后,滚动视图将调整滚动位置,以便当前可见且位于或超出 minIndexForVisible 的第一个子组件不会更改位置。这对于在两个方向加载内容的列表很有用,例如聊天线程,其中传入的新消息可能会导致滚动位置跳动。值 0 很常见,但其他值(例如 1)可用于跳过加载指示器或其他不应保持位置的内容。

可选的 autoscrollToTopThreshold 可用于在进行调整后使用户在调整前位于顶部阈值内时,使内容自动滚动到顶部。这对于聊天类应用程序也很有用,您希望看到新消息滚动到位,但如果用户向上滚动了一段距离,并且滚动太多会造成干扰,则不希望这样做。

注意 1:启用此功能后,重新排序滚动视图中的元素可能会导致跳动和卡顿。它可以修复,但目前没有计划这样做。目前,不要重新排序使用此功能的任何 ScrollView 或列表的内容。

注意 2:这在原生代码中使用 contentOffsetframe.origin 来计算可见性。遮挡、转换和其他复杂性将不被考虑在内,以确定内容是否“可见”。

类型
object: {minIndexForVisible: number, autoscrollToTopThreshold: number}

maximumZoomScale
iOS

允许的最大缩放比例。

类型默认值
number1.0

minimumZoomScale
iOS

允许的最小缩放比例。

类型默认值
number1.0

nestedScrollEnabled
Android

为 Android API 级别 21+ 启用嵌套滚动。

类型默认值
boolfalse

onContentSizeChange

当 ScrollView 的可滚动内容视图更改时调用。

处理函数将接收两个参数:内容宽度和内容高度 (contentWidth, contentHeight)

它使用附加到此 ScrollView 渲染的内容容器的 onLayout 处理程序来实现。

类型
function

onMomentumScrollBegin

当动量滚动开始时调用(当 ScrollView 开始滑动时发生的滚动)。

类型
function

onMomentumScrollEnd

当动量滚动结束时调用(当 ScrollView 滑动到停止时发生的滚动)。

类型
function

onScroll

在滚动期间,最多每帧触发一次。事件具有以下形状(所有值均为数字)

js
{
nativeEvent: {
contentInset: {bottom, left, right, top},
contentOffset: {x, y},
contentSize: {height, width},
layoutMeasurement: {height, width},
zoomScale
}
}
类型
function

onScrollBeginDrag

当用户开始拖动滚动视图时调用。

类型
function

onScrollEndDrag

当用户停止拖动滚动视图并且滚动视图停止或开始滑动时调用。

类型
function

onScrollToTop
iOS

当状态栏被点击后,滚动视图滚动到顶部时触发。

类型
function

overScrollMode
Android

用于覆盖 overScroll 模式的默认值。

可能的值

  • 'auto' - 仅当内容足够大以进行有意义的滚动时,才允许用户过度滚动此视图。
  • 'always' - 始终允许用户过度滚动此视图。
  • 'never' - 永远不允许用户过度滚动此视图。
类型默认值
enum('auto', 'always', 'never')'auto'

pagingEnabled

为 true 时,滚动视图在滚动时会在滚动视图大小的倍数处停止。这可以用于水平分页。

类型默认值
boolfalse

persistentScrollbar
Android

使滚动条在不使用时不会变为透明。

类型默认值
boolfalse

pinchGestureEnabled
iOS

为 true 时,ScrollView 允许使用捏合手势进行放大和缩小。

类型默认值
booltrue

refreshControl

一个 RefreshControl 组件,用于为 ScrollView 提供下拉刷新功能。仅适用于垂直 ScrollView(horizontal prop 必须为 false)。

请参阅 RefreshControl

类型
element

removeClippedSubviews

实验性:当 true 时,屏幕外的子视图(其 overflow 值为 hidden)在屏幕外时会从其原生支持的父视图中移除。这可以提高长列表的滚动性能。

类型默认值
boolfalse

scrollEnabled

为 false 时,无法通过触摸交互滚动视图。

请注意,始终可以通过调用 scrollTo 来滚动视图。

类型默认值
booltrue

scrollEventThrottle

限制在滚动时触发滚动事件的频率,以毫秒为单位指定时间间隔。当响应滚动执行昂贵的工作时,这可能很有用。值 ≤ 16 将禁用节流,而与设备的刷新率无关。

类型默认值
number0

scrollIndicatorInsets
iOS

滚动视图指示器从滚动视图边缘插入的量。这通常应设置为与 contentInset 相同的值。

类型默认值
object: {top: number, left: number, bottom: number, right: number}{top: 0, left: 0, bottom: 0, right: 0}

scrollPerfTag
Android

用于在此滚动视图上记录滚动性能的标签。将强制启用动量事件(请参阅 sendMomentumEvents)。这本身不做任何事情,您需要为此实现自定义原生 FpsListener 才能使其有用。

类型
string

scrollToOverflowEnabled
iOS

true 时,滚动视图可以通过编程方式滚动超出其内容大小。

类型默认值
boolfalse

scrollsToTop
iOS

true 时,当状态栏被点击时,滚动视图滚动到顶部。

类型默认值
booltrue

showsHorizontalScrollIndicator

true 时,显示水平滚动指示器。

类型默认值
booltrue

showsVerticalScrollIndicator

true 时,显示垂直滚动指示器。

类型默认值
booltrue

snapToAlignment
iOS

当设置了 snapToInterval 时,snapToAlignment 将定义捕捉与滚动视图的关系。

可能的值

  • 'start' 将对齐到左侧(水平)或顶部(垂直)的捕捉。
  • 'center' 将对齐到中心位置的捕捉。
  • 'end' 将对齐到右侧(水平)或底部(垂直)的捕捉。
类型默认值
enum('start', 'center', 'end')'start'

snapToEnd

snapToOffsets 结合使用。默认情况下,列表的末尾计为捕捉偏移量。将 snapToEnd 设置为 false 以禁用此行为,并允许列表在其末尾和最后一个 snapToOffsets 偏移量之间自由滚动。

类型默认值
booltrue

snapToInterval

设置后,使滚动视图在 snapToInterval 值的倍数处停止。这可以用于分页长度小于滚动视图的子组件。通常与 snapToAlignmentdecelerationRate="fast" 结合使用。覆盖不太可配置的 pagingEnabled prop。

类型
number

snapToOffsets

设置后,使滚动视图在定义的偏移量处停止。这可以用于分页长度小于滚动视图的不同大小的子组件。通常与 decelerationRate="fast" 结合使用。覆盖不太可配置的 pagingEnabledsnapToInterval props。

类型
array of number

snapToStart

snapToOffsets 结合使用。默认情况下,列表的开头计为捕捉偏移量。将 snapToStart 设置为 false 以禁用此行为,并允许列表在其开头和第一个 snapToOffsets 偏移量之间自由滚动。

类型默认值
booltrue

stickyHeaderHiddenOnScroll

设置为 true 时,粘性标题将在向下滚动列表时隐藏,并在向上滚动列表时停靠在列表顶部。

类型默认值
boolfalse

stickyHeaderIndices

一个子索引数组,用于确定在滚动时哪些子组件会停靠在屏幕顶部。例如,传递 stickyHeaderIndices={[0]} 将导致第一个子组件固定在滚动视图的顶部。您也可以像 [x,y,z] 这样使用,使多个项目在到达顶部时变为粘性。此属性与 horizontal={true} 结合使用时不受支持。

类型
array of number

zoomScale
iOS

滚动视图内容的当前比例。

类型默认值
number1.0

方法

flashScrollIndicators()

tsx
flashScrollIndicators();

短暂显示滚动指示器。


scrollTo()

tsx
scrollTo(
options?: {x?: number, y?: number, animated?: boolean} | number,
deprecatedX?: number,
deprecatedAnimated?: boolean,
);

滚动到给定的 x、y 偏移量,可以立即滚动,也可以平滑动画滚动。

示例

scrollTo({x: 0, y: 0, animated: true})

注意:奇怪的函数签名是由于历史原因,该函数也接受单独的参数作为 options 对象的替代方案。由于歧义(y 在 x 之前),这已被弃用,不应使用。


scrollToEnd()

tsx
scrollToEnd(options?: {animated?: boolean});

如果这是垂直 ScrollView,则滚动到底部。如果这是水平 ScrollView,则滚动到右侧。

使用 scrollToEnd({animated: true}) 进行平滑动画滚动,使用 scrollToEnd({animated: false}) 进行立即滚动。如果未传递任何选项,则 animated 默认为 true