W przypadku aplikacji podobnej do czatu chcę, aby ScrollView
komponent był przewijany do dołu, ponieważ najnowsze wiadomości pojawiają się pod starszymi. Czy możemy dostosować pozycję przewijania ScrollView
?
react-native
Stirman
źródło
źródło
Odpowiedzi:
W przypadku React Native 0.41 i nowszych możesz to zrobić za pomocą wbudowanej
scrollToEnd
metody:<ScrollView ref={ref => {this.scrollView = ref}} onContentSizeChange={() => this.scrollView.scrollToEnd({animated: true})}> </ScrollView>
źródło
root
inaczej, scrollToEnd jest niezdefiniowana. tj.this.scrollView.root.scrollToEnd
root
rzeczywistości generuje niezdefiniowany błąd.ref={ref => {this.scrollView = ref}}
ponieważ nie chcesz zwracać zadaniaUżyj onContentSizeChange, aby śledzić dolne Y widoku przewijania (wysokość)
https://facebook.github.io/react-native/docs/scrollview.html#oncontentsizechange
var _scrollToBottomY <ScrollView onContentSizeChange={(contentWidth, contentHeight)=>{ _scrollToBottomY = contentHeight; }}> </ScrollView>
następnie użyj nazwy referencyjnej widoku przewijania, np
this.refs.scrollView.scrollTo(_scrollToBottomY);
źródło
Oto najprostsze rozwiązanie, jakie mogłem wymyślić:
<ListView ref={ref => (this.listView = ref)} onLayout={event => { this.listViewHeight = event.nativeEvent.layout.height; }} onContentSizeChange={() => { this.listView.scrollTo({ y: this.listView.getMetrics().contentLength - this.listViewHeight }); }} />;
źródło
Dla każdego, kto pisze komponent funkcyjny, który może używać hooka,
import React, { useRef } from 'react'; import { ScrollView } from 'react-native'; const ScreenComponent = (props) => { const scrollViewRef = useRef(); return ( <ScrollView ref={scrollViewRef} onContentSizeChange={() => scrollViewRef.current.scrollToEnd({ animated: true })} /> ); };
źródło
Na wypadek, gdyby ktoś w 2020 roku lub później zastanawiał się, jak to osiągnąć za pomocą funkcjonalnych komponentów. Oto jak zrobiłem:
źródło
wypróbuj to rozwiązanie
xcode 10.0
RN: 56,0,0
źródło
ref=
? wydaje się być reliktemMożesz odwrócić widok przewijania / listy za pomocą
react-native-invertible-scroll-view
modułu , a następnie po prostu zadzwoń,ref.scrollTo(0)
aby przewinąć do dołu.Zainstaluj moduł:
Następnie zaimportuj komponent:
import InvertibleScrollView from 'react-native-invertible-scroll-view';
Następnie użyj następującego JSX zamiast a
ScrollView
:<InvertibleScrollView inverted ref={ref => { this.scrollView = ref; }} onContentSizeChange={() => { this.scrollView.scrollTo({y: 0, animated: true}); }} > { /* content */ } </InvertibleScrollView>
To działa, ponieważ
react-native-invertible-scroll-view
odwraca zawartość całego widoku. Zwróć uwagę, że elementy podrzędne widoku będą również renderowane w odwrotnej kolejności do normalnego widoku - pierwsze dziecko pojawi się na dole .źródło
Właściwie odpowiedź @Aniruddha nie działa dla mnie, ponieważ używam,
"react-native": "0.59.8"
athis.scrollView.root.scrollToEnd
także jest niezdefiniowanaale wymyśliłem to i to działa
this.scrollView.scrollResponderScrollToEnd({animated: true});
Jeśli używasz,
0.59.8
to zadziała LUB jeśli używasz późniejszej wersji i to działa dla Ciebie. dodaj wersje w tej odpowiedzi, aby inni nie mieli problemów.Pełny kod tutaj
źródło
Ta metoda jest trochę hakerska, ale nie mogłem znaleźć lepszego sposobu
var footerY; //Y position of the dummy view render() { return ( <View> <ScrollView ref='_scrollView'> // This is where all the things that you want to display in the scroll view goes // Below is the dummy View <View onLayout={(e)=> { footerY = e.nativeEvent.layout.y; }}/> </ScrollView> //Below is the button to scroll to the bottom <TouchableHighlight onPress={() => { this.refs._scrollView.scrollTo(footerY); }}> <Text>Scroll to Bottom</Text> </TouchableHighlight> </View> ); }
źródło
scrollToBottom
sprawia , że takie podejście jest przestarzałe w nowszych wersjach React Native.To odpowiada na Twoje pytanie: https://stackoverflow.com/a/39563100/1917250
Musisz stale przewijać do dołu strony, obliczając wysokość zawartości minus wysokość jej scrollView.
źródło
Jeśli używasz TypeScript, musisz to zrobić
źródło
Przez chwilę z tym walczyłem i w końcu wymyśliłem coś, co działało naprawdę dobrze i gładko. Jak wielu,
.scrollToEnd
bezskutecznie próbowałem . Rozwiązanie że pracował dla mnie było połączenieonContentSizeChange
,onLayout
rekwizytów i trochę więcej myślenia wizualnie o „co przewijanie do dołu” naprawdę znaczy. Ostatnia część wydaje mi się teraz trywialna, ale zajęło mi całe wieki, zanim to zrozumiałem.Biorąc pod uwagę, że
ScrollView
ma stałą wysokość, gdy wysokość zawartości przekracza wysokość kontenera, obliczyłem przesunięcie, odejmującprevHeight
(stałą wysokośćScrollView
) dlacurrHeight
(wysokość zawartości). Jeśli możesz sobie to wyobrazić wizualnie, przewijanie do tej różnicy w osi Y przesuwa wysokość zawartości nad kontenerem o to przesunięcie. Zwiększyłem swoje przesunięcie i ustawiłem obecną wysokość zawartości na poprzednią wysokość i kontynuowałem obliczanie nowego przesunięcia.Oto kod. Mam nadzieję, że to komuś pomoże.
źródło
Myślę, że jest za późno na odpowiedź, ale udało mi się jeden hack! Jeśli używasz
FlatList
, możesz włączyćinverted
właściwość, która powraca do ustawieniatransform scale
na-1
(co jest akceptowalne w przypadku innych składników listy, takich jakScrollView
...). Kiedy renderujesz swojeFlatList
dane, zawsze będzie to na dole!źródło
Spróbuj ustawić właściwość contentOffset widoku przewijania na bieżącą wysokość treści.
Aby osiągnąć to, czego potrzebujesz, możesz to zrobić w ramach wydarzenia onScroll. Może to jednak niekorzystnie wpłynąć na wrażenia użytkownika, więc bardziej przyjazne dla użytkownika może być robienie tego tylko po dołączeniu nowej wiadomości.
źródło
ScrollView
dół do poniżej całej zawartości, a nie tylko przewijanie w dół.Miałem podobny problem, ale po przeczytaniu tej strony (co przyprawia mnie o ból głowy!) Znalazłem ten bardzo fajny pakiet npm, który po prostu odwraca ListView i ułatwia aplikację do czatu !!
źródło
ScrollView
, a nie ListView).Trochę późno ... ale spójrz na to pytanie. Przewiń do góry ScrollView
ScrollView ma metodę „scrollTo”.
źródło