Eu tenho um aplicativo que possui um campo de texto na metade inferior da exibição. Isso significa que, quando digito no campo de texto, o teclado cobre o campo de texto.
Como mover a visualização para cima enquanto digito para que eu possa ver o que estou digitando e depois movê-la de volta ao seu local original quando o teclado desaparece?
Procurei em todos os lugares, mas todas as soluções parecem estar no Obj-C, que ainda não consigo converter.
Qualquer ajuda seria muito apreciada.
ios
swift
uikit
nsnotificationcenter
uikeyboard
Alex Catchpole
fonte
fonte
it is actually needed to scroll view up when keyboard appears
Respostas:
Aqui está uma solução, sem manipular o comutador de um campo de texto para outro:
Para resolver isso, substitua as duas funções
keyboardWillShow/Hide
por estas:EDITAR PARA SWIFT 3.0:
EDITAR PARA SWIFT 4.0:
EDITAR PARA SWIFT 4.2:
fonte
UIKeyboardFrameEndUserInfoKey
e nãoUIKeyboardFrameBeginUserInfoKey
ao obter o tamanho do teclado. Não sei por que, no momento, mas o primeiro trará resultados mais consistentes.UIKeyboardFrameBeginUserInfoKey
porUIKeyboardFrameEndUserInfoKey
. O primeiro fornece o quadro inicial do teclado, que chega a zero às vezes, enquanto o segundo fornece o quadro final do teclado.A maneira mais fácil que nem exige código:
O objeto se move automaticamente para cima com o teclado, em sincronia.
fonte
DispatchQueue.main.async {}
para corrigi-las. Bom trabalho! Afirmativo!Uma das respostas populares neste segmento usa o seguinte código:
Há um problema óbvio em compensar sua visualização por uma quantidade estática. Ficará bonito em um dispositivo, mas ficará ruim em qualquer outra configuração de tamanho. Você precisará obter a altura dos teclados e usá-la como seu valor de deslocamento.
Aqui está uma solução que funciona em todos os dispositivos e lida com o caso em que o usuário oculta o campo de texto previsto enquanto digita.
Solução
Importante observar abaixo, estamos passando self.view.window como nosso parâmetro de objeto. Isso nos fornecerá dados do nosso teclado, como sua altura!
A aparência será agradável em todos os dispositivos e o caso em que o usuário adiciona ou remove o campo de texto previsto.
Remover observadores
Não se esqueça de remover seus observadores antes de sair da exibição para impedir a transmissão de mensagens desnecessárias.
Atualização com base na pergunta dos comentários:
Se você tiver dois ou mais campos de texto, poderá verificar se seu view.frame.origin.y está em zero.
fonte
Adicione isso ao seu viewcontroller. Funciona como um encanto. Apenas ajuste os valores.
fonte
Eu melhorei um pouco as respostas para fazê-lo funcionar com diferentes teclados e diferentes visões / campos de texto em uma página:
Adicione observadores:
Remova os observadores:
fonte
Não é um anúncio, promoção ou spam , apenas uma boa solução. Sei que esta pergunta tem quase 30 respostas e estou tão chocado que ninguém sequer mencionou uma vez sobre esse belo projeto do GitHub que faz tudo por você e ainda melhor. Todas as respostas apenas movem a visualização para cima. Acabei de resolver todos os meus problemas com este IQKeyboardManager. Tem mais de 13000 estrelas.
Basta adicionar isso no seu podfile se você estiver usando o swift
e depois dentro do seu AppDelegate.swift faça
import IQKeyboardManagerSwift
Adicione a linha
IQKeyboardManager.shared.enable = true
para habilitá-laEsta solução é essencial se você estiver indo para produção.
fonte
import IQKeyboardManager
e usadoIQKeyboardManager.shared().isEnabled = true
na AppDelegatePara erro de tela preta (Swift 4 e 4.2) .
Corrigi o problema de tela preta. Na solução verificada A altura do teclado muda após tocar e isso está causando a tela preta.
É necessário usar UIKeyboardFrameEndUserInfoKey em vez de UIKeyboardFrameBeginUserInfoKey
fonte
Vejo que todas as respostas estão movendo a visualização em si pelo valor da altura do teclado. Bem, eu tenho uma resposta elaborada, que pode ser útil se você estiver usando restrições, ou seja
autolayout
, , que move uma visualização alterando seu valor de restrição (restrições inferiores ou superiores, por exemplo) por um valor predefinido ou você pode usar o valor do tamanho do teclado.Neste exemplo, eu uso a restrição inferior do campo de texto em Bottom Layout View com o valor inicial de 175.
fonte
Houve algumas mudanças na forma como definimos a KeyboardWillHideNotification.
Esta solução funciona com o Swift 4.2 :
fonte
Após 4-5 horas de luta, eu vim com uma extensão simples do UIViewController com um código simples que funciona como charme
* A visualização não deve se mover quando o TextField estiver acima do teclado
* Não há necessidade de definir o valor constante como NSLayoutConstraint
* Nenhuma biblioteca de terceiros é necessária
* Não é necessário código de animação
* Funciona também em tableview
* Isso funciona em Layout automático / redimensionamento automático
Adicione esta extensão do UIResponder para obter qual TextField está selecionado
Em seguida, use isso em qualquer ViewController
Registre esta notificação em
func viewWillAppear(_ animated: Bool)
Cancele o registro desta notificação em
func viewWillDisappear(_ animated:Bool)
Faça o download da demonstração aqui
fonte
Para o Swift 3, criei uma subclasse UIViewController, pois precisava de comportamento constante em todos os View Controllers.
fonte
A resposta validada não leva em consideração a posição do campo de texto e apresenta algum erro (deslocamento duplo, nunca volte à posição primária, deslocamento mesmo que o campo texex esteja no topo da visualização ...)
A ideia é:
então poderemos mover a visualização somente se necessário e o deslocamento específico para ter o texField focalizado logo acima do teclado
Aqui está o código:
Swift 4
}
fonte
Percebi que as outras respostas envolviam cortar parte da parte superior da vista. Se você deseja redimensionar a visualização sem cortar nenhum conteúdo, tente este método :)
fonte
Meus dois centavos para iniciantes: nas amostras acima, alguém altera as coordenadas, outros usa a "máscara de redimensionamento automático" e outras restrições:
Como a Apple diz, não misture esses três tipos de lógica. Se você tiver restrições no Storyboard, não tente alterar x / y. Definitivamente não funciona.
fonte
Portanto, nenhuma das outras respostas parece acertar.
O teclado com bom comportamento no iOS deve:
Meu código usa um
NSLayoutConstraint
declarado como um@IBOutlet
Você também pode usar transformações, visualizar desvios, .... Eu acho que é mais fácil com a restrição tho. Ele funciona definindo uma restrição na parte inferior; talvez seja necessário alterar o código se sua constante não for 0 / Não na parte inferior.
Aqui está o código:
fonte
sua resposta 100% perfeita para todas as atualizações do Guy Altura da tableview quando o teclado está aberto
Para Swift4.2
Swift3.2
fonte
Para Swift 3
fonte
Swift 4:
Eu estava tendo um problema com a resposta mais aceita, na qual ocultar o teclado não retornou a exibição até o final da página (apenas parcialmente). Isso funcionou para mim (+ atualizado para o Swift 4).
fonte
Semelhante à resposta @Boris, mas no Swift 5 :
fonte
Aqui está minha solução (na verdade, esse código é para o caso em que você tem poucos campos de texto em sua exibição, isso também funciona para o caso em que você possui um campo de texto)
fonte
Atualizado para o Swift 3 ...
Como já foi dito, você precisa adicionar observadores de notificação no método viewDidLoad () do seu controlador, da seguinte maneira:
Lembre-se de remover seus observadores quando apropriado (eu faço isso no método viewWillDisappear ())
Em seguida, implemente os métodos show e hide - observe a linha que instrui o aplicativo a ignorar os eventos de interação (beginIgnoringInteractionEvents). Isso é importante, pois sem ele, o usuário pode tocar em um campo ou até mesmo em uma visualização de rolagem e fazer com que a mudança ocorra uma segunda vez, resultando em uma terrível falha na interface do usuário. Ignorar eventos de interação anteriores à exibição e ocultação do teclado impedirá isso:
Por fim, reative as interações do usuário (lembre-se, este método é acionado após o teclado didShow ou didHide):
fonte
Código Swift 3
fonte
Se você possui 2 ou mais campos de texto no mesmo VC e o usuário toca em um deles e depois no outro, sem chamar a função keyboardWillHide, a visualização está subindo mais uma vez, o que não é necessário, porque você terá o teclado, um espaço em branco com a altura do teclado e a visualização, usando o código na resposta que editei:
Para resolver isso, substitua as duas funções "KeyboardWillShow / Hide" por estas:
fonte
A solução do @ Boris é MUITO boa, mas a visualização às vezes pode ser corrompida.
Para o alinhamento perfeito, use o código abaixo
Funções:
E,
fonte
este tutorial em vídeo é o melhor. 7 minutos e isso fará muito sentido. Uma solução tão simples para quando você tem vários campos de texto e deseja que a exibição de rolagem mova a quantidade "x" de pixels quando esse campo de texto específico é tocado.
https://youtu.be/VuiPGJOEBH4
Apenas estas etapas:
Coloque todos os seus campos de texto em uma visualização de rolagem restrita às bordas da visualização.
-Conecte todos os campos de texto e role a exibição como delegados ao controlador de exibição.
-Conecte todos os campos de texto e role a exibição com um IBOutlet.
-Adicione o protocolo UITextFieldDelegate à sua classe
-Adicione métodos UITextFieldDelegate ao seu arquivo rápido:
O primeiro método apenas ativa o botão de retorno no teclado para dispensá-lo. A segunda é quando você toca em qualquer campo de texto específico e, em seguida, define o deslocamento y da distância percorrida pelo scrollview (o meu se baseia na localização y dos controladores de vista 25,57,112,142). O último diz que quando você toca fora do teclado, a visualização de rolagem volta ao local original.
Eu fiz meu pixel de visualização perfeito dessa maneira!
fonte
Esse shud de recurso foi criado no Ios, no entanto, precisamos fazer isso externamente.
Insira o código abaixo
* Para mover a visualização quando o campo de texto estiver sob o teclado,
* Para não mover a visualização quando o campo de texto estiver acima do teclado
* Para mover a Visualização com base na altura do teclado, quando necessário.
Isso funciona e testado em todos os casos.
| :: | Às vezes, o modo de exibição será desativado. Nesse caso, use a altura +/- 150:
fonte
deve ser mais estável
fonte
fonte
Use o código a seguir para visualizar Up on UITextField Clicked
fonte
Fiz um cocoapod para simplificar o assunto:
https://github.com/xtrinch/KeyboardLayoutHelper
Como usá-lo:
Faça uma restrição inferior de layout automático, atribua a ele uma classe de KeyboardLayoutConstraint no módulo KeyboardLayoutHelper e o pod fará o trabalho necessário para aumentá-lo para acomodar o teclado que aparece e desaparece. Veja exemplos de projetos em exemplos de como usá-lo (fiz dois: textFields dentro de um scrollView e textFields centralizados verticalmente com duas visualizações básicas - logon e registro).
A restrição de layout inferior pode ser a visualização do contêiner, o próprio campo de texto, qualquer coisa, qualquer que seja o nome.
fonte