Pour une application de type chat, je souhaite faire ScrollView
défiler un composant vers le bas, car les messages les plus récents apparaissent sous les plus anciens. Pouvons-nous ajuster la position de défilement de a ScrollView
?
react-native
Stirman
la source
la source
Réponses:
Pour React Native 0.41 et versions ultérieures , vous pouvez le faire avec la
scrollToEnd
méthode intégrée :<ScrollView ref={ref => {this.scrollView = ref}} onContentSizeChange={() => this.scrollView.scrollToEnd({animated: true})}> </ScrollView>
la source
root
autrement, scrollToEnd n'est pas défini. iethis.scrollView.root.scrollToEnd
root
génère une erreur non définie.ref={ref => {this.scrollView = ref}}
comme vous ne voulez pas retourner le devoirUtilisez onContentSizeChange pour garder une trace du Y inférieur de la vue de défilement (hauteur)
https://facebook.github.io/react-native/docs/scrollview.html#oncontentsizechange
var _scrollToBottomY <ScrollView onContentSizeChange={(contentWidth, contentHeight)=>{ _scrollToBottomY = contentHeight; }}> </ScrollView>
puis utilisez le nom de référence de la vue de défilement comme
this.refs.scrollView.scrollTo(_scrollToBottomY);
la source
Voici la solution la plus simple que je pourrais trouver:
<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 }); }} />;
la source
Pour toute personne qui écrit un composant de fonction qui peut utiliser un hook,
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 })} /> ); };
la source
essayez cette solution
xcode 10.0
IA: 56,0,0
la source
ref=
? semble être une relique de développement WebAu cas où quelqu'un en 2020 ou plus tard se demanderait comment y parvenir avec des composants fonctionnels. Voici comment j'ai fait:
la source
Vous pouvez inverser l'affichage de défilement / liste à l'aide du
react-native-invertible-scroll-view
module , puis simplement appelerref.scrollTo(0)
pour faire défiler vers le bas.Installez le module:
Importez ensuite le composant:
import InvertibleScrollView from 'react-native-invertible-scroll-view';
Utilisez ensuite le JSX suivant au lieu d'un
ScrollView
:<InvertibleScrollView inverted ref={ref => { this.scrollView = ref; }} onContentSizeChange={() => { this.scrollView.scrollTo({y: 0, animated: true}); }} > { /* content */ } </InvertibleScrollView>
Cela fonctionne car
react-native-invertible-scroll-view
retourne tout le contenu de la vue. Notez que les enfants de la vue seront également rendus dans l'ordre opposé à une vue normale - le premier enfant apparaîtra en bas .la source
En fait, la réponse @Aniruddha ne fonctionne pas pour moi parce que j'utilise
"react-native": "0.59.8"
et qu'ellethis.scrollView.root.scrollToEnd
n'est pas définiemais je l'ai compris et cela fonctionne
this.scrollView.scrollResponderScrollToEnd({animated: true});
Si vous utilisez,
0.59.8
cela fonctionnera OU si vous utilisez une version ultérieure et cela fonctionne pour vous. veuillez ajouter des versions dans cette réponse afin que les autres n'aient pas de problèmes.Code complet ici
la source
Cette méthode est un peu piratée mais je n'ai pas trouvé de meilleur moyen
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> ); }
la source
scrollToBottom
rend des approches comme celle-ci obsolètes dans les nouvelles versions de React Native.Cela répond à votre question: https://stackoverflow.com/a/39563100/1917250
Vous devez continuer à faire défiler constamment vers le bas de la page en calculant la hauteur du contenu moins la hauteur de son scrollView.
la source
Si vous utilisez TypeScript, vous devez le faire
la source
Je me suis battu avec ça pendant un moment et j'ai finalement trouvé quelque chose qui fonctionnait vraiment bien et qui fonctionnait bien pour moi. Comme beaucoup, j'ai essayé
.scrollToEnd
en vain. La solution qui a fonctionné pour moi était une combinaison deonContentSizeChange
,onLayout
accessoires et un peu plus penser visuellement sur « ce défilement vers le bas » signifiait vraiment. La dernière partie me semble triviale maintenant, mais il m'a fallu une éternité pour comprendre.Étant donné que le
ScrollView
a une hauteur fixe, lorsque la hauteur du contenu dépasse la hauteur du conteneur, j'ai calculé le décalage en soustrayant laprevHeight
(hauteur fixe duScrollView
) pour lecurrHeight
(la hauteur du contenu). Si vous pouvez l'imaginer visuellement, en faisant défiler jusqu'à cette différence sur l'axe des y, faites glisser la hauteur du contenu sur son conteneur de ce décalage. J'ai incrémenté mon décalage et fait de la hauteur de contenu actuelle ma hauteur précédente et j'ai continué à calculer un nouveau décalage.Voici le code. J'espère que ça aide quelqu'un.
la source
Je suppose qu'il est trop tard pour répondre mais j'ai eu un hack! Si vous utilisez ,
FlatList
vous pouvez activer lainverted
propriété qui revient à la misetransform scale
à-1
( ce qui est acceptable pour d' autres composants de la liste commeScrollView
...). Lorsque vous effectuez le renduFlatList
avec des données, il sera toujours en bas!la source
Essayez de définir la propriété contentOffset de la vue de défilement sur la hauteur actuelle du contenu.
Pour accomplir ce dont vous avez besoin, vous pouvez le faire dans le cadre de l'événement onScroll. Cependant, cela peut entraîner une mauvaise expérience utilisateur, il peut donc s'avérer plus convivial de ne le faire que lorsqu'un nouveau message est ajouté.
la source
ScrollView
vers le bas tout son contenu, plutôt que de simplement faire défiler vers le bas.J'ai eu un problème similaire, mais après avoir lu cette page (ce qui me donne mal à la tête!) Je trouve ce très joli package npm qui vient d'inverser la ListView et facilite tout pour une application de chat !!
la source
ScrollView
, pas `ListView`).Un peu tard ... mais regardez cette question. Faire défiler vers le haut de ScrollView
ScrollView a une méthode "scrollTo".
la source