Saltar al contenido principal
Versión: 0.80

ScrollView

Traducción Beta No Oficial

Esta página fue traducida por PageTurner AI (beta). No está respaldada oficialmente por el proyecto. ¿Encontraste un error? Reportar problema →

Componente que envuelve el ScrollView de la plataforma proporcionando integración con el sistema de "respondedores" para bloqueo táctil.

Recuerda que los ScrollViews deben tener una altura limitada para funcionar correctamente, ya que contienen hijos de altura ilimitada dentro de un contenedor limitado (a través del desplazamiento). Para limitar la altura de un ScrollView, puedes establecer directamente la altura de la vista (no recomendado) o asegurarte de que todas las vistas padre tengan altura limitada. Olvidar transferir {flex: 1} hacia abajo en la pila de vistas puede causar errores, que el inspector de elementos permite depurar rápidamente.

Aún no admite que otros respondedores contenidos bloqueen esta vista de desplazamiento para convertirse en el respondedor.

<ScrollView> vs <FlatList>: ¿cuál usar?

ScrollView renderiza todos sus componentes hijos de React simultáneamente, pero esto tiene un impacto negativo en el rendimiento.

Imagina que tienes una lista muy larga de elementos para mostrar, quizás contenido equivalente a varias pantallas. Crear componentes JS y vistas nativas para todo a la vez, gran parte de lo cual puede no mostrarse, contribuirá a un renderizado lento y mayor consumo de memoria.

Aquí es donde entra FlatList. FlatList renderiza elementos de forma diferida cuando están a punto de aparecer, y elimina los que se desplazan fuera de pantalla para ahorrar memoria y tiempo de procesamiento.

FlatList también es útil si necesitas renderizar separadores entre elementos, múltiples columnas, carga infinita al desplazar, o cualquier otra característica que soporta de forma nativa.

Ejemplo


Referencia

Props

Props de View

Hereda las View Props.


StickyHeaderComponent

Componente de React para renderizar encabezados fijos, debe usarse con stickyHeaderIndices. Puede ser necesario si tu encabezado fijo usa transformaciones personalizadas, como cuando quieres un encabezado animado u ocultable. Si no se proporciona, se usará el componente predeterminado ScrollViewStickyHeader.

Type
component, element

alwaysBounceHorizontal
iOS

Si es true, la vista de desplazamiento rebota horizontalmente al llegar al final, incluso si el contenido es más pequeño que la propia vista.

TypeDefault
booltrue when horizontal={true}
false otherwise

alwaysBounceVertical
iOS

Si es true, la vista de desplazamiento rebota verticalmente al llegar al final, incluso si el contenido es más pequeño que la propia vista.

TypeDefault
boolfalse when horizontal={true}
true otherwise

automaticallyAdjustContentInsets
iOS

Controla si iOS debe ajustar automáticamente el inset de contenido para vistas de desplazamiento detrás de barras de navegación o pestañas/herramientas.

TypeDefault
booltrue

automaticallyAdjustKeyboardInsets
iOS

Controla si el ScrollView debe ajustar automáticamente su contentInset y scrollViewInsets cuando el teclado cambia de tamaño.

TypeDefault
boolfalse

automaticallyAdjustsScrollIndicatorInsets
iOS

Controla si iOS debe ajustar automáticamente los insets de los indicadores de desplazamiento. Ver documentación de Apple.

TypeDefault
booltrue

bounces
iOS

Si es true, la vista rebota al final del contenido cuando este es más grande que la vista en el eje de desplazamiento. Si es false, desactiva todos los rebotes incluso si las props alwaysBounce* son true.

TypeDefault
booltrue

bouncesZoom
iOS

Si es true, los gestos pueden hacer zoom más allá de min/max y se animará al valor límite al finalizar; de lo contrario, el zoom no excede los límites.

TypeDefault
booltrue

canCancelContentTouches
iOS

Si es false, al iniciar el seguimiento, no intentará arrastrar si el toque se mueve.

TypeDefault
booltrue

centerContent
iOS

Si es true, la vista centra automáticamente el contenido cuando es más pequeño que los límites del ScrollView; no tiene efecto con contenido más grande.

TypeDefault
boolfalse

contentContainerStyle

Estos estilos se aplicarán al contenedor de contenido del ScrollView que envuelve todas las vistas hijas. Ejemplo:

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

contentInset
iOS

Cantidad de inset desde los bordes del ScrollView para el contenido.

TypeDefault
object: {top: number, left: number, bottom: number, right: number}{top: 0, left: 0, bottom: 0, right: 0}

contentInsetAdjustmentBehavior
iOS

Especifica cómo se usan los insets del área segura para modificar el área de contenido del ScrollView. Disponible en iOS 11 y posteriores.

TypeDefault
enum('automatic', 'scrollableAxes', 'never', 'always')'never'

contentOffset

Usado para establecer manualmente el desplazamiento inicial (offset).

TypeDefault
Point{x: 0, y: 0}

decelerationRate

Número decimal que determina la rapidez con que la vista de desplazamiento decelera después de que el usuario levanta el dedo. También puedes usar atajos de cadena "normal" y "fast" que coinciden con las configuraciones subyacentes de iOS para UIScrollViewDecelerationRateNormal y UIScrollViewDecelerationRateFast respectivamente.

  • 'normal': 0.998 en iOS, 0.985 en Android.

  • 'fast': 0.99 en iOS, 0.9 en Android.

TypeDefault
enum('fast', 'normal'), number'normal'

directionalLockEnabled
iOS

Cuando es true, el ScrollView intentará bloquearse solo en desplazamiento vertical u horizontal durante el arrastre.

TypeDefault
boolfalse

disableIntervalMomentum

Cuando es true, la vista de desplazamiento se detiene en el siguiente índice (en relación con la posición de desplazamiento al soltar) independientemente de la velocidad del gesto. Útil para paginación cuando la página es más pequeña que el ancho del ScrollView horizontal o la altura del ScrollView vertical.

TypeDefault
boolfalse

disableScrollViewPanResponder

Cuando es true, se deshabilita el pan responder predeterminado de JS en el ScrollView, dejando el control total de los toques a sus componentes hijos. Particularmente útil con snapToInterval habilitado, ya que no sigue patrones táctiles típicos. No usar en casos de ScrollView regulares sin snapToInterval ya que puede causar toques inesperados durante el desplazamiento.

TypeDefault
boolfalse

endFillColor
Android

A veces un ScrollView ocupa más espacio del que llena su contenido. En estos casos, esta propiedad rellena el resto del ScrollView con un color para evitar establecer un fondo y crear overdraw innecesario. Es una optimización avanzada no requerida en casos generales.

Type
color

fadingEdgeLength
Android

Desvanece los bordes del contenido desplazable.

Si el valor es mayor que 0, los bordes desvanecidos se ajustarán según la dirección y posición actual del desplazamiento, indicando si hay más contenido por mostrar.

TypeDefault
number0

horizontal

Cuando es true, los elementos hijos se organizan horizontalmente en fila en lugar de verticalmente en columna.

TypeDefault
boolfalse

indicatorStyle
iOS

Estilo de los indicadores de desplazamiento.

  • 'default': igual que black.

  • 'black', el indicador de desplazamiento es black. Ideal para fondos claros.

  • 'white', el indicador de desplazamiento es white. Ideal para fondos oscuros.

TypeDefault
enum('default', 'black', 'white')'default'

invertStickyHeaders

Si los encabezados fijos deben anclarse en la parte inferior en lugar de la superior del ScrollView. Normalmente se usa con ScrollViews invertidos.

TypeDefault
boolfalse

keyboardDismissMode

Determina si el teclado se oculta al arrastrar:

  • 'none': los arrastres no ocultan el teclado.

  • 'on-drag': el teclado se oculta cuando comienza un arrastre.

Solo iOS

  • 'interactive': el teclado se oculta interactivamente con el arrastre y se mueve sincronizado con el toque. Arrastrar hacia arriba cancela el ocultamiento. En Android no es compatible y se comporta como 'none'.
TypeDefault
enum('none', 'on-drag')
Android

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

keyboardShouldPersistTaps

Determina cuándo el teclado debe permanecer visible después de un toque.

  • 'never': tocar fuera del campo de texto enfocado oculta el teclado. Los hijos no recibirán el toque.

  • 'always': el teclado no se oculta automáticamente y el ScrollView no captura toques, pero sus hijos pueden capturarlos.

  • 'handled': el teclado no se oculta automáticamente si el toque fue manejado por hijos del ScrollView.

  • false (obsoleto, usar 'never')

  • true (obsoleto, usar 'always')

TypeDefault
enum('always', 'never', 'handled', false, true)'never'

maintainVisibleContentPosition

Cuando se establece, el ScrollView ajustará la posición de desplazamiento para que el primer elemento hijo actualmente visible y en o más allá de minIndexForVisible no cambie de posición. Esto es útil para listas que cargan contenido en ambas direcciones, como un hilo de chat, donde nuevos mensajes entrantes podrían causar saltos en la posición de desplazamiento. Un valor de 0 es común, pero otros valores como 1 pueden usarse para omitir spinners de carga u otro contenido que no deba mantener su posición.

El parámetro opcional autoscrollToTopThreshold puede usarse para hacer que el contenido se desplace automáticamente al inicio después del ajuste, si el usuario estaba dentro del umbral superior antes del ajuste. También es útil en aplicaciones tipo chat donde se desea ver nuevos mensajes desplazándose a su lugar, pero no si el usuario ha desplazado hacia arriba y sería disruptivo un desplazamiento brusco.

Advertencia 1: Reordenar elementos en el ScrollView con esta función activada probablemente causará saltos y comportamiento irregular. Tiene solución pero actualmente no está planificado implementarla. Por ahora, no reordenes el contenido de ningún ScrollView o List que use esta función.

Advertencia 2: Esta función usa contentOffset y frame.origin en código nativo para calcular la visibilidad. Oclusiones, transformaciones y otras complejidades no se consideran para determinar si el contenido es "visible".

Type
object: {minIndexForVisible: number, autoscrollToTopThreshold: number}

maximumZoomScale
iOS

La escala máxima de zoom permitida.

TypeDefault
number1.0

minimumZoomScale
iOS

La escala mínima de zoom permitida.

TypeDefault
number1.0

nestedScrollEnabled
Android

Habilita el desplazamiento anidado para Android API nivel 21+.

TypeDefault
boolfalse

onContentSizeChange

Se llama cuando cambia el tamaño del contenido desplazable del ScrollView.

La función manejadora recibe dos parámetros: ancho y alto del contenido (contentWidth, contentHeight).

Se implementa usando el manejador onLayout adjunto al contenedor de contenido que renderiza este ScrollView.

Type
function

onMomentumScrollBegin

Se llama cuando comienza el desplazamiento por inercia (desplazamiento que ocurre cuando el ScrollView comienza a deslizarse).

Type
function

onMomentumScrollEnd

Se llama cuando termina el desplazamiento por inercia (desplazamiento que ocurre cuando el ScrollView se detiene gradualmente).

Type
function

onScroll

Se dispara como máximo una vez por fotograma durante el desplazamiento. El evento tiene la siguiente forma (todos los valores sin tipo especificado son números):

js
{
nativeEvent: {
contentInset: {bottom, left, right, top},
contentOffset: {x, y},
contentSize: {height, width},
layoutMeasurement: {height, width},
velocity: {x, y},
responderIgnoreScroll: boolean,
zoomScale,
// iOS only
targetContentOffset: {x, y}
}
}
Type
function

onScrollBeginDrag

Se llama cuando el usuario comienza a arrastrar el ScrollView.

Type
function

onScrollEndDrag

Se llama cuando el usuario deja de arrastrar el ScrollView y este se detiene o comienza a deslizarse por inercia.

Type
function

onScrollToTop
iOS

Se dispara cuando el ScrollView se desplaza al inicio después de tocar la barra de estado.

Type
function

overScrollMode
Android

Usado para sobrescribir el valor predeterminado del modo overScroll.

Valores posibles:

  • 'auto' - Permite over-scroll solo si el contenido es lo suficientemente grande como para desplazarse significativamente.

  • 'always' - Siempre permite over-scroll en esta vista.

  • 'never' - Nunca permite over-scroll en esta vista.

TypeDefault
enum('auto', 'always', 'never')'auto'

pagingEnabled

Cuando es true, el ScrollView se detiene en múltiplos del tamaño del ScrollView al desplazarse. Útil para paginación horizontal.

TypeDefault
boolfalse

persistentScrollbar
Android

Evita que las barras de desplazamiento se vuelvan transparentes cuando no están en uso.

TypeDefault
boolfalse

pinchGestureEnabled
iOS

Cuando es true, ScrollView permite gestos de pellizco para hacer zoom.

TypeDefault
booltrue

refreshControl

Componente RefreshControl que proporciona funcionalidad pull-to-refresh. Solo funciona en ScrollViews verticales (la prop horizontal debe ser false).

Ver RefreshControl.

Type
element

removeClippedSubviews

Experimental: Cuando es true, las vistas secundarias fuera de pantalla (cuyo valor overflow es hidden) se eliminan de su vista superior nativa cuando no están visibles. Esto puede mejorar el rendimiento del desplazamiento en listas largas.

TypeDefault
boolfalse

scrollEnabled

Cuando es false, la vista no se puede desplazar mediante interacción táctil.

Nota: La vista siempre puede desplazarse llamando a scrollTo.

TypeDefault
booltrue

scrollEventThrottle

Limita la frecuencia con que se disparan eventos de desplazamiento durante el scroll, especificado como intervalo de tiempo en ms. Útil cuando se realizan operaciones costosas en respuesta al desplazamiento. Valores ≤ 16 desactivan el throttling, independientemente de la tasa de refresco del dispositivo.

TypeDefault
number0

scrollIndicatorInsets
iOS

La cantidad en que los indicadores de desplazamiento se insertan desde los bordes del ScrollView. Normalmente debe establecerse al mismo valor que contentInset.

TypeDefault
object: {top: number, left: number, bottom: number, right: number}{top: 0, left: 0, bottom: 0, right: 0}

scrollPerfTag
Android

Etiqueta para registrar rendimiento de scroll en esta vista. Fuerza activación de eventos de momentum (ver sendMomentumEvents). Requiere implementar un FpsListener nativo personalizado para ser útil.

Type
string

scrollToOverflowEnabled
iOS

Cuando es true, el ScrollView puede desplazarse programáticamente más allá de su tamaño de contenido.

TypeDefault
boolfalse

scrollsToTop
iOS

Cuando es true, el ScrollView se desplaza al tope al tocar la barra de estado.

TypeDefault
booltrue

showsHorizontalScrollIndicator

Cuando es true, muestra un indicador de desplazamiento horizontal.

TypeDefault
booltrue

showsVerticalScrollIndicator

Cuando es true, muestra un indicador de desplazamiento vertical.

TypeDefault
booltrue

snapToAlignment

Cuando snapToInterval está establecido, snapToAlignment define la relación del snap con el ScrollView:

Valores posibles:

  • 'start' alinea el snap a la izquierda (horizontal) o superior (vertical).

  • 'center' alinea el snap al centro.

  • 'end' alinea el snap a la derecha (horizontal) o inferior (vertical).

TypeDefault
enum('start', 'center', 'end')'start'

snapToEnd

Úsalo con snapToOffsets. Por defecto, el final de la lista cuenta como offset de snap. Establece snapToEnd en false para desactivar esto y permitir scroll libre entre el final y el último offset de snapToOffsets.

TypeDefault
booltrue

snapToInterval

Al establecerlo, el ScrollView se detiene en múltiplos del valor de snapToInterval. Útil para paginar hijos más pequeños que la vista. Normalmente se combina con snapToAlignment y decelerationRate="fast". Anula la prop pagingEnabled.

Type
number

snapToOffsets

Al establecerlo, el ScrollView se detiene en los offsets definidos. Útil para paginar hijos de varios tamaños. Normalmente se combina con decelerationRate="fast". Anula las props pagingEnabled y snapToInterval.

Type
array of number

snapToStart

Úsalo con snapToOffsets. Por defecto, el inicio de la lista cuenta como offset de snap. Establece snapToStart en false para permitir scroll libre entre el inicio y el primer offset de snapToOffsets.

TypeDefault
booltrue

stickyHeaderHiddenOnScroll

Cuando es true, el encabezado sticky se oculta al desplazar hacia abajo y se acopla al tope al desplazar hacia arriba.

TypeDefault
boolfalse

stickyHeaderIndices

Un array de índices de hijos que determina qué hijos se anclan en la parte superior de la pantalla al desplazarse. Por ejemplo, pasar stickyHeaderIndices={[0]} hará que el primer hijo se fije en la parte superior del ScrollView. También puedes usar [x,y,z] para fijar múltiples elementos cuando estén en la parte superior. Esta propiedad no es compatible con horizontal={true}.

Type
array of number

zoomScale
iOS

La escala actual del contenido del ScrollView.

TypeDefault
number1.0

Métodos

flashScrollIndicators()

tsx
flashScrollIndicators();

Muestra momentáneamente los indicadores de desplazamiento.


scrollTo()

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

Desplaza hasta un desplazamiento x, y dado, ya sea inmediatamente o con una animación suave.

Ejemplo:

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

Nota: La extraña firma de función se debe a que, por razones históricas, la función también acepta argumentos separados como alternativa al objeto de opciones. Esto está obsoleto debido a la ambigüedad (y antes de x), y NO DEBE USARSE.


scrollToEnd()

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

Si es un ScrollView vertical, se desplaza hasta el final. Si es un ScrollView horizontal, se desplaza hasta la derecha.

Usa scrollToEnd({animated: true}) para un desplazamiento animado suave, scrollToEnd({animated: false}) para desplazamiento inmediato. Si no se pasan opciones, animated por defecto es true.