Estou tentando criar uma tela de entrada para o iPhone. A tela possui vários campos de entrada. A maioria está na parte superior da tela, mas há dois campos na parte inferior. Quando o usuário tenta editar o texto na parte inferior da tela, o teclado aparece e cobre a tela. Encontrei uma solução simples para mover a tela para cima quando isso acontece, mas o resultado é que a tela sempre se move para cima e os campos na parte superior da tela ficam fora de alcance quando o usuário tenta editá-los.
Existe uma maneira de mover a tela apenas quando os campos inferiores são editados?
Eu usei esse código que encontrei aqui :
override func viewDidLoad() {
super.viewDidLoad()
NSNotificationCenter.defaultCenter().addObserver(self, selector: Selector("keyboardWillShow:"), name: UIKeyboardWillShowNotification, object: nil)
NSNotificationCenter.defaultCenter().addObserver(self, selector: Selector("keyboardWillHide:"), name: UIKeyboardWillHideNotification, object: nil)
}
func keyboardWillShow(sender: NSNotification) {
self.view.frame.origin.y -= 150
}
func keyboardWillHide(sender: NSNotification) {
self.view.frame.origin.y += 150
}
Respostas:
Seu problema está bem explicado neste documento pela Apple . O código de exemplo nesta página (em
Listing 4-1
) faz exatamente o que você precisa; ele rolará sua visualização somente quando a edição atual estiver sob o teclado. Você só precisa colocar os controles necessários em um scrollViiew. O único problema é que esse é o Objective-C e acho que você precisa dele no Swift ... então ... aqui está:Declarar uma variável
depois adicione esses métodos
Certifique-se de declarar seu ViewController como
UITextFieldDelegate
e defina delegados corretos nos seus métodos de inicialização: ex:E lembre-se de ligar
registerForKeyboardNotifications
no viewInit ederegisterFromKeyboardNotifications
na saída.Editar / Atualizar: Sintaxe do Swift 4.2
fonte
UIKeyboardFrameEndUserInfoKey
vez deUIKeyboardFrameBeginUserInfoKey
, porque o último retorna a altura 0. E mude o ponto mais acertado para o fundo, não para a origem.if let activeField = self.activeField { var point = activeField.frame.origin point.y += activeField.frame.size.height if (!aRect.contains(point)){ self.scrollView.scrollRectToVisible(activeField.frame, animated: true) } }
textField's didBeginEditing
método é chamado DEPOIS que okeyboardWillShow
método foi chamado. Como resultado, aactiveField
variável ainda é nula, o que significa que nenhuma rolagem automática acontece. Minha solução foi colocar aactiveField = textField
chamada noshouldBeginEditing
método do textField . Isso resolve o problema da ordem das chamadas.Aqui estão meus 2 centavos:
Você já tentou: https://github.com/hackiftekhar/IQKeyboardManager
Extremamente fácil de instalar Swift ou Objective-C.
Aqui como funciona:
IQKeyboardManager (Swift): - O IQKeyboardManagerSwift está disponível no CocoaPods; para instalá-lo, basta adicionar a seguinte linha ao seu Podfile: (# 236)
No AppDelegate.swift, apenas importe a estrutura IQKeyboardManagerSwift e ative o IQKeyboardManager.
E isso é tudo. Fácil!
fonte
IQKeyboardManager.shared.enable = true
O que eu achei que funcionou perfeitamente para mim foi o seguinte:
Você também pode alterar os valores da altura. Remova a instrução "if" se desejar usá-la para todos os campos de texto.
Você pode até usar isso para todos os controles que requerem entrada do usuário como o TextView.
fonte
Eu tive um problema semelhante e encontrei uma solução bastante direta sem usar um scrollView e, em vez disso, usando instruções if nos métodos keyboardWillShow / Hide.
Essa foi uma boa solução para mim, porque eu tinha apenas dois campos de texto.
Desloca a visualização inteira para cima: somente quando determinados campos de texto (bottomText) são editados
Desloca a vista inteira para baixo: somente quando a vista não está no local original
fonte
Basta usar esta extensão para mover qualquer UIView quando o teclado for apresentado.
Em seguida, em sua viewdidload vincule sua visualização ao teclado
fonte
Por que não implementar isso em um UITableViewController? O teclado não oculta nenhum campo de texto quando é mostrado.
fonte
Swift 4 (** atualizado ) com extensão **
inViewDidLoad
adicione a seguinte extensão
fonte
Eu uso o SwiftLint, que teve alguns problemas com a formatação da resposta aceita. Especificamente:
sem espaço antes dos dois pontos, sem projeção forçada, prefira UIEdgeInset (superior: etc ... em vez de UIEdgeInsetMake.
então aqui estão essas atualizações para o Swift 3
fonte
Eu acho que esta cláusula está errada:
Embora a origem do activeField possa estar acima do teclado, o maxY pode não ...
Eu criaria um ponto 'max' para o activeField e verificaria se isso está no teclado Rect.
fonte
Aqui está a minha versão depois de ler a documentação fornecida pela Apple e as postagens anteriores. Uma coisa que notei é que o textView não foi tratado quando coberto pelo teclado. Infelizmente, a documentação da Apple não funcionará porque, por qualquer motivo, o teclado é chamado APÓS o textoViewDidBeginEditing. Eu lidei com isso chamando um método central que verifica se o teclado é exibido E se um textView ou textField está sendo editado. Dessa forma, o processo é acionado apenas quando AMBAS as condições existem.
Outro ponto do textViews é que a altura deles pode ser tal que o teclado corta a parte inferior do textView e não se ajustaria se o ponto superior esquerdo do visor estivesse em exibição. Portanto, o código que escrevi pega o ponto inferior esquerdo de qualquer textView ou textField, com referência à tela, e vê se ele cai nas coordenadas com referência à tela do teclado apresentado, o que implica que o teclado cobre uma parte dele.
Se você estiver usando um controlador de navegação, a subclasse também definirá o ajuste automático da exibição de rolagem para inserções como false.
Ele percorre cada textView e textField para definir delegados para manipulação
Basta definir sua classe base para a subclasse criada aqui para obter resultados.
fonte
Respostas impressionantes já foram dadas, mas esta é uma maneira diferente de lidar com essa situação (usando o Swift 3x ):
Primeiro, chame o seguinte método em
viewWillAppear()
Agora pegue um
IBOutlet
dosUIView
principais constrangimentos 's do seuUIViewcontroller
assim: (aqui oUIView
está a subexibição deUIScrollView
isso significa que você deve ter umUIScrollView
para todas as suassubViews
)E uma outra variável como a seguir e adicione um delegado, ou seja
UITextFieldDelegate
:Depois disso, aqui está a parte mágica, basta colar este trecho abaixo :
Agora o último trecho:
Não se esqueça de atribuir delegados a todos os seus
UITextField
sUIStoryboard
Boa sorte!
fonte
Sintaxe do Swift 3:
este é um bom método para obter o que você deseja, você pode adicionar condições "if" para determinados campos de texto, mas esse tipo funciona para todos ... Espero que possa ser útil para todos
fonte
Primeiro, declare uma variável para identificar seu UITextField ativo.
Passo 1:-
Como
var activeTextField: UITextField
?Etapa 2: - Depois disso, adicione essas duas linhas no viewDidLoad.
Etapa 3:-
Agora defina esses dois métodos na sua classe de controlador.
fonte
Faça uma var de uitextfield
No seu viewdid load
Conheça o campo de texto clicado. provavelmente você está tendo campos de texto em toda a tela.
Verifique se o teclado está cobrindo o campo de texto ou não.
Retornar para fechar o teclado
UPDATE: NSNotification.Name.UIKeyboardWillShow e NSNotification.Name.UIKeyboardWillHide são renomeados para UIResponder.keyboardWillShowNotification e UIResponder.keyboardWillHideNotification respectivamente.
fonte
Swift : você pode fazer isso verificando qual textField está sendo apresentado.
fonte
Esse código move o campo de texto que você está editando para que você possa visualizá-lo no Swift 3. Para esta resposta, você também precisa tornar sua visualização em UITextFieldDelegate:
E então em viewDidLoad:
Quais chamadas (fora do viewDidLoad):
fonte
Swift 3
fonte
A resposta aceita é quase perfeita. Mas preciso usar, em
UIKeyboardFrameEndUserInfoKey
vez de,UIKeyboardFrameBeginUserInfoKey,
porque o último retorna a altura 0. do keyborad. E mude o ponto mais avançado para o fundo, não para a origem.fonte
Swift 4 Atualizei minha solução
com animação de restrição no teclado mostrar / ocultar, divirta-se.
fonte
Swift 4
Você pode facilmente mover para cima e para baixo
UITextField
com o teclado com animaçãofonte
Swift 4.2
Minha solução (verticalmente) centralizará a exibição em um
UITextField
se sua posição estiver sob o teclado.Etapa 1: Crie um novo arquivo rápido e copie e cole a
UIViewWithKeyboard
classe.Etapa 2: no Interface Builder, defina-o como uma classe personalizada para os seus melhores
UIView
.fonte
Reescrito para o veloz 4.2
Em ViewDidLoad ..
Funções restantes
fonte
"Esqueci de mencionar que sou novo no Swift :( Qual seria a sintaxe correta para verificar isso? (Como obtenho o nome do campo nessa função?)"
Está bem . Primeiro confirme com o protocolo UITextFieldDelegate
Em seguida, implemente a função
Observe que a abordagem correta é usar uma visualização de rolagem e colocar a visualização que deve ser deslocada para cima / baixo na visualização de rolagem e manipular os eventos do teclado de acordo.
fonte
Para Swift 4.2
Este código permitirá controlar o momento do eixo Y do quadro para um tamanho de tela específico do dispositivo.
PS: Esse código não moverá o quadro de maneira inteligente com base na localização do TextField.
Crie uma extensão para UIDevice
Adicionar NotificationObserver em viewDidLoad
Seletor
fonte