Przejdź do treści głównej
Wersja: 0.77

ScrollView

Nieoficjalne Tłumaczenie Beta

Ta strona została przetłumaczona przez PageTurner AI (beta). Nie jest oficjalnie zatwierdzona przez projekt. Znalazłeś błąd? Zgłoś problem →

Komponent opakowujący natywny ScrollView platformy, zapewniający integrację z systemem "responderów" blokujących dotyk.

Pamiętaj, że ScrollView musi mieć ograniczoną wysokość, aby działać poprawnie, ponieważ zawiera dzieci o nieograniczonej wysokości w ograniczonym kontenerze (poprzez interakcję przewijania). Aby ograniczyć wysokość ScrollView, możesz bezpośrednio ustawić wysokość widoku (niezalecane) lub upewnić się, że wszystkie widoki nadrzędne mają ograniczoną wysokość. Zapomnienie o przekazaniu {flex: 1} w dół hierarchii widoków może prowadzić do błędów, które inspektor elementów pozwala szybko zdebugować.

Nie obsługuje jeszcze blokowania innych responderów, które uniemożliwiałyby temu ScrollView zostanie responderem.

<ScrollView> kontra <FlatList> - którego użyć?

ScrollView renderuje wszystkie swoje komponenty potomne jednocześnie, co ma negatywny wpływ na wydajność.

Wyobraź sobie, że masz bardzo długą listę elementów do wyświetlenia, być może zawierającą treść o rozmiarze kilku ekranów. Tworzenie komponentów JS i natywnych widoków dla wszystkich elementów na raz, z których wiele może nigdy nie zostać wyświetlonych, przyczyni się do wolnego renderowania i zwiększonego zużycia pamięci.

Tutaj wkracza FlatList. FlatList renderuje elementy leniwie, gdy mają się pojawić na ekranie, i usuwa elementy, które przewiną się poza ekran, aby oszczędzać pamięć i czas procesora.

FlatList jest również przydatny, jeśli chcesz renderować separatory między elementami, wiele kolumn, nieskończone ładowanie podczas przewijania lub wiele innych funkcji, które obsługuje od ręki.

Przykład​


Dokumentacja

Właściwości​

Właściwości widoku​

Dziedziczy właściwości widoku.


StickyHeaderComponent​

Komponent React używany do renderowania przyklejonych nagłówków, powinien być używany razem z stickyHeaderIndices. Może być potrzebny, jeśli twój przyklejony nagłówek używa niestandardowych transformacji, na przykład gdy chcesz, aby lista miała animowany i chowalny nagłówek. Jeśli komponent nie został podany, zostanie użyty domyślny komponent ScrollViewStickyHeader.

Type
component, element

alwaysBounceHorizontal
iOS
​

Gdy true, przewijany widok odbija się poziomo po osiągnięciu końca, nawet jeśli zawartość jest mniejsza niż sam przewijany widok.

TypeDefault
booltrue when horizontal={true}
false otherwise

alwaysBounceVertical
iOS
​

Gdy true, ScrollView odbija się pionowo po osiągnięciu końca, nawet jeśli zawartość jest mniejsza niż sam ScrollView.

TypeDefault
boolfalse when horizontal={true}
true otherwise

automaticallyAdjustContentInsets
iOS
​

Kontroluje, czy iOS powinien automatycznie dostosowywać wcięcie zawartości dla ScrollView umieszczonych pod paskiem nawigacyjnym lub zakładkami/paskiem narzędzi.

TypeDefault
booltrue

automaticallyAdjustKeyboardInsets
iOS
​

Kontroluje, czy ScrollView powinien automatycznie dostosowywać swoje contentInset i scrollViewInsets gdy klawiatura zmienia rozmiar.

TypeDefault
boolfalse

automaticallyAdjustsScrollIndicatorInsets
iOS
​

Kontroluje, czy iOS powinien automatycznie dostosowywać wcięcia wskaźnika przewijania. Zobacz dokumentację Apple dotyczącą tej właściwości.

TypeDefault
booltrue

bounces
iOS
​

Gdy true, ScrollView odbija się po osiągnięciu końca zawartości, jeśli zawartość jest większa niż ScrollView wzdłuż osi przewijania. Gdy false, wyłącza wszystkie odbicia, nawet jeśli właściwości alwaysBounce* są ustawione na true.

TypeDefault
booltrue

bouncesZoom
iOS
​

Gdy true, gesty mogą przekroczyć min/max skalowania, a powiększenie animuje do wartości min/max po zakończeniu gestu; w przeciwnym razie powiększenie nie przekroczy limitów.

TypeDefault
booltrue

canCancelContentTouches
iOS
​

Gdy false, po rozpoczęciu śledzenia, nie spróbuje przeciągać, jeśli dotyk się przesunie.

TypeDefault
booltrue

centerContent
iOS
​

Gdy true, ScrollView automatycznie wyśrodkowuje zawartość, gdy jest ona mniejsza niż granice ScrollView; gdy zawartość jest większa, ta właściwość nie ma efektu.

TypeDefault
boolfalse

contentContainerStyle​

Te style zostaną zastosowane do kontenera zawartości ScrollView, który opakowuje wszystkie widoki potomne. Przykład:

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

contentInset
iOS
​

Wielkość wcięcia zawartości ScrollView od krawędzi ScrollView.

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

contentInsetAdjustmentBehavior
iOS
​

Ta właściwość określa, jak wcięcia bezpiecznego obszaru są używane do modyfikacji obszaru zawartości ScrollView. Dostępne od iOS 11 i nowszych.

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

contentOffset​

Służy do ręcznego ustawienia początkowego przesunięcia przewijania.

TypeDefault
Point{x: 0, y: 0}

decelerationRate​

Liczba zmiennoprzecinkowa określająca szybkość wyhamowywania przewijania po zwolnieniu palca. Można użyć skrótów tekstowych: "normal" i "fast", które odpowiadają ustawieniom iOS dla UIScrollViewDecelerationRateNormal i UIScrollViewDecelerationRateFast.

  • 'normal': 0.998 w iOS, 0.985 w Androidzie.

  • 'fast': 0.99 w iOS, 0.9 w Androidzie.

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

directionalLockEnabled
iOS
​

Gdy true, ScrollView próbuje blokować przewijanie tylko w pionie lub poziomie podczas przeciągania.

TypeDefault
boolfalse

disableIntervalMomentum​

Gdy true, przewijanie zatrzyma się na następnym indeksie (względem pozycji przy zwolnieniu) niezależnie od prędkości gestu. Przydatne przy paginacji, gdy strona jest mniejsza niż szerokość poziomego ScrollView lub wysokość pionowego.

TypeDefault
boolfalse

disableScrollViewPanResponder​

Gdy true, wyłącza domyślny mechanizm reagowania na gesty w JS, pozostawiając pełną kontrolę nad dotknięciami komponentom potomnym. Szczególnie przydatne z snapToInterval, ponieważ nie stosuje typowych wzorców dotknięć. Nie używaj bez snapToInterval, bo może powodować nieoczekiwane zachowania.

TypeDefault
boolfalse

endFillColor
Android
​

Gdy ScrollView zajmuje więcej miejsca niż jego zawartość, ta właściwość wypełnia pozostały obszar kolorem, unikając ustawiania tła i niepotrzebnego przemalowywania. Zaawansowana optymalizacja, zwykle niepotrzebna.

Type
color

fadingEdgeLength
Android
​

Wygasza krawędzie przewijanej treści.

Wartość większa niż 0 ustawia efekt wygaszania zgodnie z kierunkiem przewijania, wskazując dodatkową treść.

TypeDefault
number0

horizontal​

Gdy true, elementy potomne są ułożone poziomo w rzędzie zamiast pionowo w kolumnie.

TypeDefault
boolfalse

indicatorStyle
iOS
​

Styl wskaźników przewijania.

  • 'default' to samo co black.

  • 'black', wskaźnik przewijania jest black. Dobry na jasnym tle.

  • 'white', wskaźnik przewijania jest white. Dobry na ciemnym tle.

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

invertStickyHeaders​

Gdy true, przyklejone nagłówki trzymają się dołu zamiast góry ScrollView. Zwykle używane z odwróconymi ScrollView.

TypeDefault
boolfalse

keyboardDismissMode​

Określa, czy klawiatura ma być chowana w odpowiedzi na przeciąganie.

  • 'none': przeciąganie nie chowa klawiatury.

  • 'on-drag': klawiatura chowa się przy rozpoczęciu przeciągania.

Tylko iOS

  • 'interactive': klawiatura chowana jest interaktywnie z przeciąganiem, ruch synchronizowany z palcem. Przeciągnięcie w górę anuluje chowanie. Android nieobsługiwane - zachowanie jak 'none'.
TypeDefault
enum('none', 'on-drag')
Android

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

keyboardShouldPersistTaps​

Określa, kiedy klawiatura powinna pozostać widoczna po dotknięciu.

  • 'never': dotknięcie poza polem tekstowym chowa klawiaturę. Dzieci nie otrzymają dotknięcia.

  • 'always': klawiatura nie chowa się automatycznie, a ScrollView nie przechwytuje dotknięć (ale dzieci mogą).

  • 'handled': klawiatura nie chowa się automatycznie, gdy dotknięcie obsłużyły dzieci ScrollView (lub przodek).

  • false, przestarzałe, użyj 'never'

  • true, przestarzałe, użyj 'always'

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

maintainVisibleContentPosition​

Po ustawieniu, widok przewijania automatycznie dostosuje pozycję przewijania tak, aby pierwsze widoczne dziecko na poziomie minIndexForVisible lub dalsze nie zmieniało swojej pozycji. Jest to przydatne w listach ładowanych dwukierunkowo (np. wątek czatu), gdzie nowe wiadomości mogłyby powodować skoki pozycji przewijania. Wartość 0 jest najczęstsza, ale można użyć innych wartości (np. 1) by pominąć animacje ładowania lub inne elementy, które nie powinny utrzymywać pozycji.

Opcjonalny parametr autoscrollToTopThreshold może wymusić automatyczne przewinięcie do góry po dostosowaniu, jeśli użytkownik znajdował się w pobliżu progu przed zmianą. Przydatne w aplikacjach typu czat, gdzie chcemy widzieć nowe wiadomości pojawiające się na dole, ale nie gdy użytkownik już przewinął w górę i takie przewijanie byłoby uciążliwe.

Uwaga 1: Zmiana kolejności elementów w widoku przewijania z aktywną tą funkcją prawdopodobnie spowoduje nienaturalne skoki. Można to naprawić, ale obecnie nie ma takich planów. Na razie nie zmieniaj kolejności treści w ScrollView ani listach używających tej funkcji.

Uwaga 2: Mechanizm wykorzystuje contentOffset i frame.origin w kodzie natywnym do określenia widoczności. Nie uwzględnia przesłaniania, transformacji ani innych złożonych czynników przy ocenie "widoczności" treści.

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

maximumZoomScale
iOS
​

Maksymalna dozwolona skala powiększenia.

TypeDefault
number1.0

minimumZoomScale
iOS
​

Minimalna dozwolona skala powiększenia.

TypeDefault
number1.0

nestedScrollEnabled
Android
​

Włącza zagnieżdżone przewijanie dla Androida (poziom API 21+).

TypeDefault
boolfalse

onContentSizeChange​

Wywoływane gdy zmienia się rozmiar przewijalnej zawartości ScrollView.

Funkcja obsługi otrzymuje dwa parametry: szerokość i wysokość zawartości (contentWidth, contentHeight).

Zaimplementowane przy użyciu procedury onLayout dołączonej do kontenera zawartości renderowanego przez ScrollView.

Type
function

onMomentumScrollBegin​

Wywoływane przy rozpoczęciu przewijania z rozpędu (gdy ScrollView zaczyna płynnie sunąć).

Type
function

onMomentumScrollEnd​

Wywoływane przy zakończeniu przewijania z rozpędu (gdy ScrollView kończy płynnie sunąć).

Type
function

onScroll​

Wywoływane maksymalnie raz na klatkę podczas przewijania. Struktura zdarzenia (wszystkie nieokreślone typy to liczby):

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​

Wywoływane gdy użytkownik rozpoczyna przeciąganie widoku przewijania.

Type
function

onScrollEndDrag​

Wywoływane gdy użytkownik kończy przeciąganie i przewijanie zatrzymuje się lub zaczyna płynnie sunąć.

Type
function

onScrollToTop
iOS
​

Wywoływane gdy przewijanie dotrze do góry po dotknięciu paska statusu.

Type
function

overScrollMode
Android
​

Służy do nadpisania domyślnego trybu przewijania poza krawędzie (overScroll).

Dopuszczalne wartości:

  • 'auto' - Pozwala na przewijanie poza krawędzie tylko gdy zawartość jest wystarczająco duża do sensownego przewijania.

  • 'always' - Zawsze pozwala na przewijanie poza krawędzie.

  • 'never' - Nigdy nie pozwala na przewijanie poza krawędzie.

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

pagingEnabled​

Gdy true, przewijanie zatrzymuje się na wielokrotnościach rozmiaru widoku przewijania. Może być używane do paginacji poziomej.

TypeDefault
boolfalse

persistentScrollbar
Android
​

Zapobiega przezroczystości pasków przewijania gdy nie są używane.

TypeDefault
boolfalse

pinchGestureEnabled
iOS
​

Gdy true, ScrollView umożliwia powiększanie gestem szczypania.

TypeDefault
booltrue

refreshControl​

Komponent RefreshControl zapewniający funkcję "pull-to-refresh". Działa tylko dla pionowych ScrollView (horizontal musi być false).

Patrz RefreshControl.

Type
element

removeClippedSubviews​

Eksperymentalne: Gdy true, widoki potomne znajdujące się poza ekranem (których wartość overflow to hidden) są usuwane z natywnego widoku nadrzędnego, gdy są niewidoczne. Może to poprawić wydajność przewijania długich list.

TypeDefault
boolfalse

scrollEnabled​

Gdy false, blokuje przewijanie przez interakcję dotykową.

Pamiętaj, że widok zawsze można przewinąć, wywołując scrollTo.

TypeDefault
booltrue

scrollEventThrottle​

Ogranicza częstotliwość wysyłania zdarzeń przewijania podczas scrollowania, określoną jako interwał czasowy w ms. Może to być przydatne, gdy w odpowiedzi na przewijanie wykonywana jest kosztowna operacja. Wartości ≤ 16 wyłączają ograniczanie, niezależnie od częstotliwości odświeżania urządzenia.

TypeDefault
number0

scrollIndicatorInsets
iOS
​

Wielkość, o jaką wskaźniki przewijania są wsunięte od krawędzi widoku przewijania. Powinna być zwykle ustawiona na taką samą wartość jak contentInset.

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

scrollPerfTag
Android
​

Tag używany do logowania wydajności przewijania w tym widoku. Wymusi włączenie zdarzeń momentum (patrz sendMomentumEvents). Domyślnie nie robi nic - aby był użyteczny, potrzebujesz własnej implementacji natywnego FpsListener.

Type
string

scrollToOverflowEnabled
iOS
​

Gdy true, widok przewijania może być programowo przewijany poza rozmiar swojej zawartości.

TypeDefault
boolfalse

scrollsToTop
iOS
​

Gdy true, widok przewijania będzie przewijał się do góry po dotknięciu paska stanu.

TypeDefault
booltrue

showsHorizontalScrollIndicator​

Gdy true, pokazuje poziomy wskaźnik przewijania.

TypeDefault
booltrue

showsVerticalScrollIndicator​

Gdy true, pokazuje pionowy wskaźnik przewijania.

TypeDefault
booltrue

snapToAlignment​

Gdy ustawiono snapToInterval, snapToAlignment definiuje relację przyciągania do widoku przewijania.

Dopuszczalne wartości:

  • 'start' wyrówna przyciąganie do lewej (poziomo) lub góry (pionowo).

  • 'center' wyrówna przyciąganie do środka.

  • 'end' wyrówna przyciąganie do prawej (poziomo) lub dołu (pionowo).

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

snapToEnd​

Używaj razem z snapToOffsets. Domyślnie koniec listy liczy się jako offset przyciągania. Ustaw snapToEnd na false, aby wyłączyć to zachowanie i umożliwić swobodne przewijanie między końcem listy a ostatnim offsetem snapToOffsets.

TypeDefault
booltrue

snapToInterval​

Po ustawieniu powoduje, że widok przewijania zatrzymuje się na wielokrotnościach wartości snapToInterval. Może być używane do paginacji przez elementy potomne o długościach mniejszych niż widok przewijania. Zwykle używane z snapToAlignment i decelerationRate="fast". Nadpisuje mniej konfigurowalną właściwość pagingEnabled.

Type
number

snapToOffsets​

Po ustawieniu powoduje, że widok przewijania zatrzymuje się na zdefiniowanych offsetach. Może być używane do paginacji przez elementy potomne o różnych rozmiarach mniejszych niż widok przewijania. Zwykle używane z decelerationRate="fast". Nadpisuje właściwości pagingEnabled i snapToInterval.

Type
array of number

snapToStart​

Używaj razem z snapToOffsets. Domyślnie początek listy liczy się jako offset przyciągania. Ustaw snapToStart na false, aby wyłączyć to zachowanie i umożliwić swobodne przewijanie między początkiem listy a pierwszym offsetem snapToOffsets.

TypeDefault
booltrue

stickyHeaderHiddenOnScroll​

Gdy ustawione na true, przyklejony nagłówek będzie ukrywany podczas przewijania listy w dół i dokowany na górze podczas przewijania w górę.

TypeDefault
boolfalse

stickyHeaderIndices​

Tablica indeksów elementów potomnych określająca, które elementy są dokowane do góry ekranu podczas przewijania. Np. stickyHeaderIndices={[0]} spowoduje, że pierwszy element potomny będzie przymocowany do góry widoku. Można użyć [x,y,z] do przyklejenia wielu elementów. Nieobsługiwane z horizontal={true}.

Type
array of number

zoomScale
iOS
​

Bieżąca skala zawartości widoku przewijania.

TypeDefault
number1.0

Metody​

flashScrollIndicators()​

tsx
flashScrollIndicators();

Wyświetla tymczasowo wskaźniki przewijania.


scrollTo()​

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

Przewija do podanego przesunięcia x, y - natychmiast lub z płynną animacją.

Przykład:

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

Uwaga: Dziwna sygnatura funkcji wynika z faktu, że z przyczyn historycznych funkcja akceptuje również osobne argumenty jako alternatywę dla obiektu opcji. To podejście jest przestarzałe z powodu niejednoznaczności (y przed x) i NIE POWINNO BYĆ UŻYWANE.


scrollToEnd()​

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

W przypadku pionowego ScrollView przewija do dołu. W przypadku poziomego ScrollView przewija do prawej krawędzi.

Użyj scrollToEnd({animated: true}) do płynnego przewijania z animacją, scrollToEnd({animated: false}) do natychmiastowego przewijania. Jeśli nie przekazano opcji, domyślnie używana jest wartość animated ustawiona na true.