Estou usando o Swift para programar com iOS e estou usando esse código para mover o UITextField
, mas ele não funciona. Chamo a função keyboardWillShow
corretamente, mas o campo de texto não se move. Estou usando o autolayout.
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);
}
deinit {
NSNotificationCenter.defaultCenter().removeObserver(self);
}
func keyboardWillShow(notification: NSNotification) {
if let keyboardSize = (notification.userInfo?[UIKeyboardFrameBeginUserInfoKey] as? NSValue)?.CGRectValue() {
//let contentInsets = UIEdgeInsets(top: 0, left: 0, bottom: keyboardSize.height, right: 0)
var frame = self.ChatField.frame
frame.origin.y = frame.origin.y - keyboardSize.height + 167
self.chatField.frame = frame
println("asdasd")
}
}
ios
swift
cocoa-touch
keyboard
uitextfield
Pedro Manfredi
fonte
fonte
Respostas:
Há algumas melhorias a serem feitas nas respostas existentes.
Em primeiro lugar, o UIKeyboardWillChangeFrameNotification é provavelmente a melhor notificação, pois lida com alterações que não são apenas mostrar / ocultar, mas também devido a alterações no teclado (idioma, usando teclados de terceiros etc.) e rotações também (mas observe o comentário abaixo indicando que o teclado ocultará também ser tratado para suportar a conexão do teclado de hardware).
Em segundo lugar, os parâmetros de animação podem ser extraídos da notificação para garantir que as animações estejam corretamente juntas.
Provavelmente, existem opções para limpar esse código um pouco mais, especialmente se você se sentir confortável com a força de desembrulhar o código do dicionário.
Swift 3
(Editado para explicar a animação do teclado fora da tela em vez de encolher, conforme o incrível comentário de @ Gabox abaixo)
Swift 5
fonte
endFrame?.size.height
não é nulo. Eu tenho o quadro final comoUIKeyboardFrameEndUserInfoKey = "NSRect: {{0, 1024}, {768, 264}}";
. Executado no iOS 8.3 iPad Simulator, Portrait. Xcode6.3 beta4..UIKeyboardWillChangeFrame
não dispara quando um teclado de hardware está conectado, mesmo que o teclado do iOS desapareça. Você precisa observar.UIKeyboardWillHide
também para entender esse caso extremo.Se você estiver usando o Layout Automático, presumo que você tenha definido o Espaço Inferior para a restrição Superview . Se for esse o caso, você simplesmente precisa atualizar o valor da restrição. Veja como você faz isso com um pouco de animação.
Os 20 codificados permanentemente são adicionados apenas para exibir um pouco o campo de texto acima do teclado. Caso contrário, a margem superior do teclado e a margem inferior do campo de texto estariam tocando.
Quando o teclado for descartado, redefina o valor da restrição para o original.
fonte
UIKeyboardWillShowNotification
notificação. Veja o código na pergunta do OP.animateWithDuration
e chameself.view.layoutIfNeeded()
dentro do bloco animado.Uma solução simples é mover a visualização para cima com a constante da altura do teclado.
Swift 5:
fonte
self.view.frame.origin.y -= 150
useself.view.frame.origin.y = -150
e em vez deself.view.frame.origin.y += 150
usarself.view.frame.origin.y = 0
. Isso evita que a visualização se mova 150 toda vez que um novo campo é tocado.Para mover sua visualização durante a edição do campo de texto, tente isso, apliquei isso,
Opção 1: - ** ** Atualização no Swift 5.0 e iPhone X, XR, XS e XS Max Move usando o NotificationCenter
Registre esta notificação em
func viewWillAppear(_ animated: Bool)
Cancele o registro desta notificação em
func viewWillDisappear(_ animated: Bool)
Nota: - Se você não fizer o cancelamento do registro, ele chamará da classe filho e causará uma falha ou outra falha.
Opção 2 :- Seu trabalho é bom
Eu recebi esta resposta desta fonte UITextField sobe quando o teclado aparece no Swift
No Swift 4 ---
fonte
Eu amo código Swift limpo. Então, aqui está o código mais rígido que eu poderia criar para mover uma exibição de texto para cima / baixo com o teclado. Atualmente, ele está trabalhando em um aplicativo de produção iOS8 / 9 Swift 2.
ATUALIZAÇÃO (março de 2016): acabei de reforçar meu código anterior o máximo possível. Além disso, existem várias respostas populares aqui que codificam a altura do teclado e os parâmetros de animação. Não há necessidade disso, sem mencionar que os números nessas respostas nem sempre estão alinhados com os valores reais que estou vendo no meu 6s + iOS9 (altura do teclado de 226, duração de 0,25 e curva de animação de 7). De qualquer forma, quase não há código extra para obter esses valores diretamente do sistema. Ver abaixo.
NOTA: Este código cobre o caso mais comentado / geral. No entanto, mais códigos podem ser necessários para lidar com diferentes orientações e / ou teclados personalizados. Aqui está um artigo detalhado sobre o trabalho com o teclado iOS. Se você precisar lidar com todos os cenários, isso pode ajudar.
fonte
as
para lançamentos de força.as!
pode funcionar, mas como você pode ver em outro lugar nesta página, evito lançamentos de força e desembrulhar-me.baseConstraint
, pode ser embaseConstraint.constant = moveUp ? keyboardHeight : 0
vez debaseConstraint.constant = moveUp ? -keyboardHeight : 0
.Editar : eu recomendo uma solução mais fácil e limpa. Apenas altere a classe da restrição de espaçamento inferior para KeyboardLayoutConstraint . Ele será expandido automaticamente para a altura do teclado.
Esta é uma versão aprimorada da resposta de @JosephLord.
Conforme testado no iOS 8.3 iPad Simulator, Portrait. Xcode6.3 beta4, achei sua resposta não funciona quando o teclado está escondido, porque
UIKeyboardFrameEndUserInfoKey
é"NSRect: {{0, 1024}, {768, 264}}";
. A altura nunca é0
.Isso remonta ao uso do tradicional
UIKeyboardWillShowNotification
eUIKeyboardWillHideNotification
para saber melhor quando o teclado está oculto, em vez de depender da altura do quadro final.UIKeyboardWillShowNotification
também é enviado quando o quadro do teclado é alterado, para cobrir todos os casos de uso.fonte
Estou trabalhando com o swift 4 e resolvi esse problema sem usar nenhuma restrição extra extra, veja meu código aqui. ele está realmente trabalhando no meu caso
1) Adicionar observador de notificação no carregamento carregado
2) Remova o Notification Observer como
3) Adicione métodos de apresentação / ocultação de teclado como
4) Adicione delegado textfeild e adicione touchesBegan métodos. Útil para ocultar o teclado quando tocar fora do textfeild na tela
fonte
UIKeyboardFrameEndUserInfoKey
NSNotification.Name.UIKeyboardWillShow
é renomeado paraUIResponder.keyboardWillShowNotification
tambémUIKeyboardFrameBeginUserInfoKey
paraUIResponder.keyboardFrameBeginUserInfoKey
Esta é uma versão aprimorada da resposta de Joseph Joseph e @ Hlung. Pode ser aplicado se você possui a barra de tabulação ou não. E isso restauraria perfeitamente a exibição movida pelo teclado para a posição original.
fonte
A maneira mais fácil que não requer nenhum código:
O objeto se move automaticamente para cima com o teclado, em sincronia.
fonte
Criei um protocolo Swift 3 para lidar com a aparência / desaparecimento do teclado
Em seguida, para implementá-lo em um UIViewController, faça o seguinte:
deixe o viewController estar em conformidade com este protocolo:
comece a observar as alterações do teclado no viewWillAppear:
pare de observar as alterações do teclado no modo viewWillDisappear:
crie um IBOutlet para a restrição inferior a partir do storyboard:
(Eu recomendo que toda a sua interface do usuário seja incorporada a um "contentView" e vincule a essa propriedade a restrição inferior deste contentView ao guia de layout inferior)
altere a prioridade da restrição superior para 250 (baixa)
Isso permite que toda a exibição do conteúdo deslize para cima quando o teclado aparecer. A prioridade deve ser menor do que qualquer outra prioridade de restrição nas subvisões, incluindo conteúdo que abraça prioridades / prioridades de resistência à compactação de conteúdo.
Pode ser necessário adicionar uma restrição "maior que igual" para isso:
E aqui está você!
fonte
import UIKit
Essa
UIViewController
extensão simples pode ser usadaExemplo de uso
Solução Swift 4
Swift 4.2
fonte
removeKeyboardObserver()
método aqui não remove realmente o observador. Se você não chamar isso, verá umInvalid conditions for UIKeyboardWillChangeFrameNotification
no console a partir do método add. Se você ligar para isso, verá o mesmo erro, o que significa que o observador não será removido. A documentação declara "Para cancelar o registro de observações, você passa o objeto retornado por este método pararemoveObserver(_:)
". Portanto, o que você faz é salvar o objeto retornado por esse método e depois transmiti-lo quando desejar remover o observador.Você pode usar esta biblioteca e apenas uma linha de código em appDidFinishedLaunching e você será concluída.
IQKeyboardManager - ajuste a visualização sempre que o teclado aparecer no link - https://github.com/hackiftekhar/IQKeyboardManager
fonte
E, finalmente, como estamos usando métodos delegados
refatorado do uso do objetivo-c http://www.cocoawithlove.com/2008/10/sliding-uitextfields-around-to-avoid.html
fonte
var animateDistance: CGFloat!
vantagem Eu tive que lidar com o UIKeyboardWillHideNotification para quando o usuário pressionar o botão ocultar o teclado.Outra solução que não depende de autolayout, restrições ou quaisquer saídas. O que você precisa é de seus campos em uma visualização de rolagem.
fonte
UIKeyboardWillShowNotification
chamada.Aqui está a minha versão de uma solução para o Swift 2.2:
Primeiro registro para as notificações Mostrar / Ocultar do teclado
Em seguida, nos métodos correspondentes a essas notificações, mova a visualização principal para cima ou para baixo
O truque está na parte "keyboardWillShow", que recebe chamadas sempre que a "Barra de sugestões do QuickType" é expandida ou recolhida. Em seguida, sempre definimos a coordenada y da vista principal, que é igual ao valor negativo da altura total do teclado (com ou sem a parte "Barra de tipos rápidos").
No final, não se esqueça de remover os observadores
fonte
A seguir, é uma solução simples, na qual o campo de texto tem uma restrição que o vincula ao guia de layout inferior. Ele simplesmente adiciona a altura do teclado à constante da restrição.
fonte
Bem, acho que talvez seja tarde demais, mas encontrei outra versão simples da resposta de Saqib. Estou usando o Autolayout com restrições. Eu tenho uma visão pequena dentro de outra visão principal com campos de nome de usuário e senha. Em vez de alterar a coordenada y da visualização, estou salvando o valor da restrição original em uma variável e alterando a constante da restrição para algum valor e novamente depois que o teclado é descartado, estou configurando a restrição para a original. Dessa forma, evita-se o problema que a resposta de Saqib tem (a visão continua subindo e não para). Abaixo está o meu código ...
fonte
Resposta Swift 4.x, mesclando respostas de @ Joseph Joseph e @ Isuru.
bottomConstraint
representa a restrição inferior da visualização que você deseja mover.fonte
Eu fiz da seguinte maneira:
Isso é útil quando a visão geral do campo de texto é vista
fonte
fonte
Eu fiz da seguinte maneira:
fonte
Se você é como eu, que já tentou todas as soluções acima e ainda assim o seu problema não está resolvido, eu tenho uma ótima solução para você que funciona como um encanto. Primeiro, quero esclarecer algumas coisas sobre algumas das soluções mencionadas acima.
fonte
Aqui está uma solução genérica para todas as etapas do TextField -
1) Crie um ViewController comum que seja estendido por outros ViewControllers
2) Crie uma extensão do UIViewController e o TextField atualmente ativo
extensão UIViewController {func getSelectedTextField () -> UITextField? {
}
fonte
Muito simples e sem necessidade de codificar mais. Basta adicionar
pod 'IQKeyboardManagerSwift'
seu podfile e, na suaAppDelegate
página, adicionar o código abaixo.e no
didFinishLaunchingWithOptions()
tipo de métodoé isso. verifique este link de vídeo para entender melhor https://youtu.be/eOM94K1ZWN8 Espero que isso ajude você.
fonte
Código completo para gerenciar o teclado.
fonte
Modifiquei a solução @Simpa um pouco .........
fonte
Nenhum deles funcionou e acabei usando inserções de conteúdo para mover minha visualização quando o teclado aparecer.
Nota: eu estava usando um UITableView
Solução referenciada @ keyboard-content-offset que foi inteiramente escrita no objetivo C, a solução abaixo é Swift limpa.
Adicione o observador de notificações @ viewDidLoad ()
Para obter o tamanho do teclado, primeiro obtemos o dicionário userInfo do objeto de notificação, que armazena quaisquer objetos adicionais que nosso destinatário possa usar.
Nesse dicionário, podemos obter o objeto CGRect que descreve o quadro do teclado usando a tecla UIKeyboardFrameBeginUserInfoKey.
Aplique a inserção de conteúdo para o método table view @ keyboardWillBeShown,
Restaurar o método view @ keyboardWillBeHidden
Se você quiser manter a orientação do dispositivo também em consideração, use instruções condicionais para adaptar o código às suas necessidades.
fonte
fonte
A solução Swift 4 que uso usa o tamanho do teclado. Substitua
serverStatusStackView
por qualquer que seja sua visão, por exemploself.view
::fonte
A melhor maneira é usar o NotificationCenter para capturar ações do teclado. Você pode seguir as etapas deste pequeno artigo https://medium.com/@demirciy/keyboard-handling-deb1a96a8207
fonte