He visto este truco para que las aplicaciones nativas se desplacen automáticamente por la ventana, pero me pregunto cuál es la mejor manera de hacerlo en React Native ... Cuando un <TextInput>
campo se enfoca y se posiciona bajo en la vista, el teclado cubrirá el campo de texto.
Puede ver este problema en la TextInputExample.js
vista de ejemplo de UIExplorer .
¿Alguien tiene una buena solución?
Respuestas:
2017 respuesta
El
KeyboardAvoidingView
es probablemente el mejor camino a seguir ahora. Consulte los documentos aquí . Es realmente simple en comparación con elKeyboard
módulo que le da al desarrollador más control para realizar animaciones. Spencer Carli demostró todas las formas posibles en su blog de medio .Respuesta 2015
La forma correcta de hacer esto
react-native
no requiere bibliotecas externas, aprovecha el código nativo e incluye animaciones.Primero defina una función que manejará el
onFocus
evento para cada unoTextInput
(o cualquier otro componente al que le gustaría desplazarse):Luego, en tu función de render:
Esto usa
RCTDeviceEventEmitter
para eventos de teclado y dimensionamiento, mide la posición del componente usandoRCTUIManager.measureLayout
y calcula el movimiento de desplazamiento exacto requerido enscrollResponderInputMeasureAndScrollToKeyboard
.Es posible que desee jugar con el
additionalOffset
parámetro para adaptarse a las necesidades de su diseño de interfaz de usuario específico.fuente
import {findNodeHandle} from 'react-native'
stackoverflow.com/questions/37626851/…Facebook de código abierto
KeyboardAvoidingView
en react native 0.29 para resolver este problema. Puede encontrar ejemplos de documentación y uso aquí .fuente
DeviceEventEmitter.addListener('keyboardDidShow', this.keyboardDidShow.bind(this));
Combinamos parte del formato de código react-native-keyboard-spacer y el código de @Sherlock para crear un componente KeyboardHandler que se puede envolver alrededor de cualquier Vista con elementos TextInput. ¡Funciona de maravilla! :-)
fuente
Primero debe instalar react-native-keyboardevents .
Luego, de vuelta en la tierra de JavaScript:
Necesita importar los eventos react-native-keyboar.
Luego, en su vista, agregue algún estado para el espacio del teclado y actualice escuchando los eventos del teclado.
Finalmente, agregue un espaciador a su función de renderizado debajo de todo para que cuando aumente el tamaño, resalte sus cosas.
También es posible usar la API de animación, pero por simplicidad simplemente ajustamos después de la animación.
fuente
this.listView.getScrollResponder().scrollTo(rowID * rowHeight);
esto se llama en TextInput de una fila cuando recibe un evento onFocus.react-native-keyboard-awareness-scroll-view resolvió el problema por mí. react-native-keyboard-awareness-scroll-view en GitHub
fuente
Prueba esto:
...
...
...
...
...
Funcionó para mí. La vista básicamente se reduce cuando se muestra el teclado y vuelve a crecer cuando está oculto.
fuente
Solo quería mencionar, ahora hay una
KeyboardAvoidingView
en RN. Simplemente impórtelo y utilícelo como cualquier otro módulo en RN.Aquí está el enlace a la confirmación en RN:
https://github.com/facebook/react-native/commit/8b78846a9501ef9c5ce9d1e18ee104bfae76af2e
Está disponible desde 0.29.0
También han incluido un ejemplo en UIExplorer.
fuente
Quizás sea demasiado tarde, pero la mejor solución es usar una biblioteca nativa, IQKeyboardManager
Simplemente arrastre y suelte el directorio IQKeyboardManager desde el proyecto de demostración a su proyecto de iOS. Eso es. También puede configurar algunos valores, ya que está habilitada la barra de herramientas, o el espacio entre la entrada de texto y el teclado en el archivo AppDelegate.m. Más detalles sobre la personalización se encuentran en el enlace de la página de GitHub que agregué.
fuente
Usé TextInput.onFocus y ScrollView.scrollTo.
fuente
@Stephen
Si no le importa que la altura no se anime exactamente a la misma velocidad a la que aparece el teclado, puede usar LayoutAnimation, para que al menos la altura no salte a su lugar. p.ej
importa LayoutAnimation desde react-native y agrega los siguientes métodos a tu componente.
Algunas animaciones de ejemplo son (estoy usando la primavera de arriba):
ACTUALIZAR:
Vea la respuesta de @ sherlock a continuación, a partir de react-native 0.11, el cambio de tamaño del teclado se puede resolver utilizando la funcionalidad incorporada.
fuente
Puede combinar algunos de los métodos en algo un poco más simple.
Adjunte un oyente onFocus a sus entradas
Nuestro método de desplazamiento hacia abajo se parece a:
Esto le dice a nuestra vista de desplazamiento (recuerde agregar una referencia) que se desplace hacia abajo hasta la posición de nuestra entrada enfocada - 200 (es aproximadamente del tamaño del teclado)
Aquí reiniciamos nuestra vista de desplazamiento hacia arriba,
fuente
Estoy usando un método más simple, pero aún no está animado. Tengo un estado de componente llamado "bumpedUp" que por defecto es 0, pero lo establezco en 1 cuando el textInput se enfoca, así:
En mi entrada de texto:
También tengo un estilo que le da al contenedor de envoltura de todo en esa pantalla un margen inferior y un margen superior negativo, como este:
Y luego, en el contenedor de envoltura, configuro los estilos de esta manera:
Por lo tanto, cuando el estado "bumpedUp" se establece en 1, el estilo bumpedcontainer se activa y mueve el contenido hacia arriba.
Un poco hacky y los márgenes están codificados, pero funciona :)
fuente
Utilizo la respuesta brysgo para subir la parte inferior de mi vista de desplazamiento. Luego utilizo onScroll para actualizar la posición actual de la vista de desplazamiento. Luego encontré este React Native: Obtener la posición de un elemento para obtener la posición del texto de entrada. Luego hago algunas matemáticas simples para averiguar si la entrada está en la vista actual. Luego uso scrollTo para mover la cantidad mínima más un margen. Es bastante suave. Aquí está el código para la parte de desplazamiento:
fuente
También me encuentro con esta pregunta. Finalmente, lo resuelvo definiendo la altura de cada escena, como por ejemplo:
Y también uso un módulo de terceros https://github.com/jaysoo/react-native-extra-dimensions-android para obtener la altura real.
fuente