Já vi esse hack para aplicativos nativos rolarem automaticamente a janela, mas me perguntando a melhor maneira de fazer isso no React Native ... Quando um <TextInput>
campo recebe o foco e é posicionado baixo na visualização, o teclado cobre o campo de texto.
Você pode ver esse problema no exemplo de TextInputExample.js
visualização do UIExplorer .
Alguém tem uma boa solução?
Respostas:
Resposta de 2017
Este
KeyboardAvoidingView
é provavelmente o melhor caminho a seguir agora. Confira a documentação aqui . É realmente simples em comparação com oKeyboard
módulo, o que dá ao desenvolvedor mais controle para realizar animações. Spencer Carli demonstrou todas as maneiras possíveis em seu blog médio .Resposta de 2015
A maneira correta de fazer isso
react-native
não requer bibliotecas externas, aproveita o código nativo e inclui animações.Primeiro defina uma função que tratará o
onFocus
evento para cada umTextInput
(ou qualquer outro componente para o qual você gostaria de rolar):Então, em sua função de renderização:
Isso usa
RCTDeviceEventEmitter
para eventos e dimensionamento do teclado, mede a posição do componente usandoRCTUIManager.measureLayout
e calcula o movimento de rolagem exato necessário emscrollResponderInputMeasureAndScrollToKeyboard
.Você pode querer brincar com o
additionalOffset
parâmetro, para se adequar às necessidades de seu design de IU específico.fonte
import {findNodeHandle} from 'react-native'
stackoverflow.com/questions/37626851/…O Facebook abriu o código-fonte
KeyboardAvoidingView
em react nativos 0,29 para resolver este problema. A documentação e o exemplo de uso podem ser encontrados aqui .fonte
DeviceEventEmitter.addListener('keyboardDidShow', this.keyboardDidShow.bind(this));
Combinamos parte da forma de código react-native-keyboard-spacer e o código de @Sherlock para criar um componente KeyboardHandler que pode ser agrupado em qualquer View com elementos TextInput. Funciona como um encanto! :-)
fonte
Primeiro você precisa instalar os eventos react-native-keyboard .
Em seguida, de volta à terra do javascript:
Você precisa importar os eventos react-native-keyboard.
Em seguida, em sua visualização, adicione algum estado para o espaço do teclado e atualize a partir da escuta dos eventos do teclado.
Finalmente, adicione um espaçador à sua função de renderização embaixo de tudo para que, quando aumentar o tamanho, bata no seu material.
Também é possível usar a API de animação, mas para simplificar, apenas ajustamos após a animação.
fonte
this.listView.getScrollResponder().scrollTo(rowID * rowHeight);
isso é chamado em TextInput de uma linha quando recebe um evento onFocus.react-native-keyboard-aware-scroll-view resolveu o problema para mim. react-native-keyboard-aware-scroll-view no GitHub
fonte
Experimente isto:
...
...
...
...
...
Funcionou para mim A visualização basicamente diminui quando o teclado é exibido e volta a crescer quando está oculto.
fonte
Só queria citar, agora existe um
KeyboardAvoidingView
no RN. Basta importá-lo e usá-lo como qualquer outro módulo do RN.Aqui está o link para o commit no RN:
https://github.com/facebook/react-native/commit/8b78846a9501ef9c5ce9d1e18ee104bfae76af2e
Está disponível a partir de 0.29.0
Eles também incluíram um exemplo no UIExplorer.
fonte
Talvez seja tarde demais , mas a melhor solução é usar uma biblioteca nativa, IQKeyboardManager
Basta arrastar e soltar o diretório IQKeyboardManager do projeto de demonstração para o seu projeto iOS. É isso aí. Além disso, você pode configurar alguns valores, como isToolbar habilitado, ou o espaço entre a entrada de texto e o teclado no arquivo AppDelegate.m. Mais detalhes sobre a personalização estão no link da página GitHub que adicionei.
fonte
Usei TextInput.onFocus e ScrollView.scrollTo.
fonte
@Stephen
Se você não se importa em não ter a animação de altura exatamente na mesma taxa que o teclado aparece, você pode apenas usar LayoutAnimation, para que pelo menos a altura não pule no lugar. por exemplo
importar LayoutAnimation de react-native e adicionar os seguintes métodos ao seu componente.
Alguns exemplos de animações são (estou usando a mola acima):
ATUALIZAR:
Veja a resposta de @sherlock abaixo, a partir do react-native 0.11, o redimensionamento do teclado pode ser resolvido usando a funcionalidade embutida.
fonte
Você pode combinar alguns dos métodos em algo um pouco mais simples.
Anexe um ouvinte onFocus em suas entradas
Nosso método de rolagem para baixo se parece com:
Isso diz à nossa visualização de rolagem (lembre-se de adicionar um ref) para rolar para baixo até a posição de nossa entrada focada - 200 (é aproximadamente do tamanho do teclado)
Aqui, redefinimos nossa visualização de rolagem de volta ao topo
fonte
Estou usando um método mais simples, mas ainda não está animado. Eu tenho um estado de componente chamado "bumpedUp", que é definido como 0 por padrão, mas definido como 1 quando o textInput obtém o foco, assim:
No meu textInput:
Eu também tenho um estilo que dá ao contêiner de embalagem de tudo na tela uma margem inferior e uma margem superior negativa, assim:
E então, no contêiner de embalagem, defino os estilos assim:
Portanto, quando o estado "bumpedUp" é definido como 1, o estilo bumpedcontainer entra em ação e move o conteúdo para cima.
Meio hacky e as margens são codificadas, mas funciona :)
fonte
Eu uso a resposta brysgo para aumentar a parte inferior do meu scrollview. Então eu uso o onScroll para atualizar a posição atual do scrollview. Então, encontrei este React Native: Obtendo a posição de um elemento para obter a posição da entrada de texto. Em seguida, faço algumas contas simples para descobrir se a entrada está na visualização atual. Em seguida, uso scrollTo para mover a quantidade mínima mais uma margem. É muito bom. Aqui está o código para a parte de rolagem:
fonte
Eu também encontro esta questão. Por fim, resolvo isso definindo a altura de cada cena, como:
E também uso um módulo de terceiros https://github.com/jaysoo/react-native-extra-dimensions-android para obter a altura real.
fonte