J'ai vu ce hack pour les applications natives pour faire défiler automatiquement la fenêtre, mais je me demande la meilleure façon de le faire dans React Native ... Lorsqu'un <TextInput>
champ obtient le focus et est positionné bas dans la vue, le clavier couvrira le champ de texte.
Vous pouvez voir ce problème dans la TextInputExample.js
vue de l' exemple UIExplorer .
Quelqu'un at-il une bonne solution?
Réponses:
Réponse 2017
C'est
KeyboardAvoidingView
probablement la meilleure façon de procéder maintenant. Consultez les documents ici . C'est vraiment simple par rapport auKeyboard
module qui donne au développeur plus de contrôle pour effectuer des animations. Spencer Carli a démontré toutes les manières possibles sur son blog médium .Réponse de 2015
La bonne façon de faire cela
react-native
ne nécessite pas de bibliothèques externes, tire parti du code natif et inclut des animations.Définissez d'abord une fonction qui gérera l'
onFocus
événement pour chacunTextInput
(ou pour tout autre composant vers lequel vous souhaitez faire défiler):Ensuite, dans votre fonction de rendu:
Cela utilise
RCTDeviceEventEmitter
pour les événements de clavier et le dimensionnement, mesure la position du composant à l'aideRCTUIManager.measureLayout
et calcule le mouvement de défilement exact requis dansscrollResponderInputMeasureAndScrollToKeyboard
.Vous voudrez peut-être jouer avec le
additionalOffset
paramètre, pour répondre aux besoins de votre conception d'interface utilisateur spécifique.la source
import {findNodeHandle} from 'react-native'
stackoverflow.com/questions/37626851/…Facebook open source
KeyboardAvoidingView
en react native 0.29 pour résoudre ce problème. La documentation et l'exemple d'utilisation peuvent être trouvés ici .la source
DeviceEventEmitter.addListener('keyboardDidShow', this.keyboardDidShow.bind(this));
Nous avons combiné une partie de la forme de code react-native-keyboard-spacer et le code de @Sherlock pour créer un composant KeyboardHandler qui peut être enveloppé autour de n'importe quelle vue avec des éléments TextInput. Fonctionne comme un charme! :-)
la source
Vous devez d'abord installer react-native-keyboardevents .
Puis de retour au pays javascript:
Vous devez importer les événements de réaction-native-keyboard.
Ensuite, dans votre vue, ajoutez un état pour l'espace clavier et mettez à jour en écoutant les événements clavier.
Enfin, ajoutez un espaceur à votre fonction de rendu sous tout, donc quand il augmente la taille, cela augmente votre contenu.
Il est également possible d'utiliser l'API d'animation, mais par souci de simplicité, nous nous contentons d'ajuster après l'animation.
la source
this.listView.getScrollResponder().scrollTo(rowID * rowHeight);
cela est appelé sur TextInput d'une ligne lorsqu'il reçoit un événement onFocus.react-native-keyboard-aware-scroll-view a résolu le problème pour moi. react-native-keyboard-aware-scroll-view sur GitHub
la source
Essaye ça:
...
...
...
...
...
Cela a fonctionné pour moi. La vue se rétrécit fondamentalement lorsque le clavier est affiché et repousse lorsqu'il est masqué.
la source
Je voulais juste mentionner, maintenant il y a un
KeyboardAvoidingView
RN. Il suffit de l'importer et de l'utiliser comme n'importe quel autre module de RN.Voici le lien vers le commit sur RN:
https://github.com/facebook/react-native/commit/8b78846a9501ef9c5ce9d1e18ee104bfae76af2e
Il est disponible à partir de 0.29.0
Ils ont également inclus un exemple sur UIExplorer.
la source
C'est peut-être trop tard, mais la meilleure solution est d'utiliser une bibliothèque native, IQKeyboardManager
Faites simplement glisser et déposez le répertoire IQKeyboardManager du projet de démonstration vers votre projet iOS. C'est tout. Vous pouvez également configurer certains valus, comme isToolbar activé, ou l'espace entre la saisie de texte et le clavier dans le fichier AppDelegate.m. Plus de détails sur la personnalisation se trouvent dans le lien de page GitHub que j'ai ajouté.
la source
J'ai utilisé TextInput.onFocus et ScrollView.scrollTo.
la source
@Stephen
Si cela ne vous dérange pas de ne pas animer la hauteur exactement à la même vitesse que celle du clavier, vous pouvez simplement utiliser LayoutAnimation, de sorte qu'au moins la hauteur ne se mette pas en place. par exemple
importez LayoutAnimation de react-native et ajoutez les méthodes suivantes à votre composant.
Quelques exemples d'animations sont (j'utilise le ressort ci-dessus):
METTRE À JOUR:
Voir la réponse de @ sherlock ci-dessous, à partir de react-native 0.11, le redimensionnement du clavier peut être résolu à l'aide de la fonctionnalité intégrée.
la source
Vous pouvez combiner quelques-unes des méthodes en quelque chose d'un peu plus simple.
Attachez un auditeur onFocus à vos entrées
Notre méthode de défilement vers le bas ressemble à quelque chose comme:
Cela indique à notre vue de défilement (n'oubliez pas d'ajouter une référence) de faire défiler jusqu'à la position de notre entrée focalisée - 200 (c'est à peu près la taille du clavier)
Ici, nous réinitialisons notre vue de défilement vers le haut,
la source
J'utilise une méthode plus simple, mais elle n'est pas encore animée. J'ai un état de composant appelé "bumpedUp" que je par défaut à 0, mais mis à 1 lorsque textInput obtient le focus, comme ceci:
Sur mon textInput:
J'ai aussi un style qui donne au conteneur d'emballage de tout sur cet écran une marge inférieure et une marge supérieure négative, comme ceci:
Et puis sur le conteneur d'emballage, j'ai défini les styles comme ceci:
Ainsi, lorsque l'état "bumpedUp" est mis à 1, le style bumpedcontainer entre en action et déplace le contenu vers le haut.
Un peu hacky et les marges sont codées en dur, mais ça marche :)
la source
J'utilise brysgo answer pour élever le bas de mon scrollview. Ensuite, j'utilise le onScroll pour mettre à jour la position actuelle du scrollview. J'ai ensuite trouvé ce React Native: Obtenir la position d'un élément pour obtenir la position de l'entrée de texte. Je fais ensuite quelques calculs simples pour déterminer si l'entrée est dans la vue actuelle. Ensuite, j'utilise scrollTo pour déplacer le montant minimum plus une marge. C'est assez fluide. Voici le code pour la partie défilante:
la source
Je rencontre également cette question. Enfin, je le résolve en définissant la hauteur de chaque scène, telle que:
Et, j'utilise également un module tiers https://github.com/jaysoo/react-native-extra-dimensions-android pour obtenir la hauteur réelle.
la source