Eu tenho um aplicativo em que, no Interface Builder , configurei um UIView
que tenha um campo de texto próximo à parte inferior da exibição. Quando executo o aplicativo e tento inserir texto nesse campo, o teclado desliza para cima do campo, para que eu não possa ver o que estou digitando até ocultar o teclado novamente.
Alguém mais encontrou esse problema e encontrou uma boa maneira de resolvê-lo sem tornar a exibição pai rolável ou mover o campo de texto mais para cima na tela?
ios
iphone
keyboard
uitextfield
Cruinh
fonte
fonte
Respostas:
A solução usual é deslizar o campo (e tudo o que está acima dele) com uma animação e depois voltar ao final. Pode ser necessário colocar o campo de texto e alguns dos outros itens em outra exibição e deslizar a exibição como uma unidade. (Eu chamo essas coisas de "placas" como em "placas tectônicas", mas sou apenas eu). Mas aqui está a idéia geral, se você não precisa ser extravagante.
fonte
Isso funcionou maravilhas para mim deslizando uitextfields
Em particular, ele tem o benefício de calcular a distância da animação do slide, dependendo da posição do campo de texto.
fonte
O IQKeyboardManager faz isso para você sem NO LINE OF CODE , apenas é necessário arrastar e soltar o arquivo de origem relacionado ao projeto. O IQKeyboardManager também suporta Orientação a dispositivos , Gerenciamento automático da barra de ferramentas do UIT , keyboardDistanceFromTextField e muito mais do que você pensa.
Aqui está o fluxograma de controle:
Passo 1: - Adicionado notificações globais de
UITextField
,UITextView
eUIKeyboard
em uma única classe. Eu chamei de IQKeyboardManager .Etapa 2: - Se encontrado
UIKeyboardWillShowNotification
,UITextFieldTextDidBeginEditingNotification
ouUITextViewTextDidBeginEditingNotification
notificações, tente obter atopMostViewController
instância daUIWindow.rootViewController
hierarquia. A fim de adequadamente uncoverUITextField
/UITextView
sobre ele,topMostViewController.view
's quadro precisa ser ajustado.Etapa 3: - Distância calculada de movimento esperada
topMostViewController.view
em relação à primeira respostaUITextField
/UITextView
.Passo 4: - Movido para
topMostViewController.view.frame
cima / baixo de acordo com a distância de movimento esperada.Etapa 5: - Se encontrado
UIKeyboardWillHideNotification
,UITextFieldTextDidEndEditingNotification
ouUITextViewTextDidEndEditingNotification
notificação, tente novamente obtertopMostViewController
instância daUIWindow.rootViewController
hierarquia.Etapa 6: - Distância perturbada calculada da
topMostViewController.view
qual precisa ser restaurada para sua posição original.Passo 7: - Restaurado de
topMostViewController.view.frame
acordo com a distância perturbada.Etapa 8: - Instância da classe IQKeyboardManager singleton instanciada no carregamento do aplicativo, para que todos
UITextField
/UITextView
no aplicativo se ajustem automaticamente de acordo com a distância de movimentação esperada.Isso é tudo
fonte
Para expandir a resposta do Amagrammer, aqui está uma classe de amostra:
LoginViewController.h
Observe que estamos implementando o "UITextFieldDelegate"
LoginViewController.m
fonte
UIApplicationDidEnterBackgroundNotification
, caso contrário, ele se moverá mais para baixo se você pressionar o botão Início e entrar novamente no aplicativo, fazendo com que ele fique feio e com erros.Que tal a solução oficial: Movendo o conteúdo localizado sob o teclado
fonte
Eu enfrentei o mesmo problema nas
UITableView
células textField. Resolvo esse problema implementando o método a seguir para escutar a notificação do teclado.Observador para as notificações aqui:
Manipule essas notificações usando a função abaixo:
fonte
Veja isso. Sem problemas para você.
Esta solução é muito elegante. Tudo o que você precisa fazer é adicionar seus campos de texto em a
UIScrollView
e alterar sua classe paraTPKeyboardAvoidingScollView
, se você estiver usando storyboards. A exibição de rolagem é estendida de forma a detectar quando o teclado está visível e se move acima do teclado a uma distância razoável. É a solução perfeita porque é independente da suaUIViewController
. Tudo o que é necessário é feito dentro da classe mencionada acima. Obrigado Michael Tyson e tudo.TPKeyboardAvoiding
fonte
Abaixo está uma versão rápida da resposta do Amagrammer. Além disso, uma variação usando o evento UIKeyboardWillShowNotification, pois eu precisava saber o tamanho dos teclados antes de mudar a exibição.
fonte
Houve um grande passo a passo na edição de campos de texto sem obscurecer (link morto agora, aqui está um link do Wayback: https://web.archive.org/web/20091123074029/http://acts-as-geek.blogspot.com/2009/ 11 / editing-textfields-without-obscuring.html ). Ele mostra como mover um existente
UIView
para umUIScrollView
e rolar automaticamente quando o teclado aparece.Atualizei-o um pouco para calcular a altura correta para
UIScrollView
quando houver controles (como aUITabBar
) abaixo doUIScrollBar
. Consulte a publicação da atualização do uiview .fonte
Aqui está uma solução usando o Xcode5, iOS7:
Use os blocos UITextfieldDelegate e de animação.
Isso é quase todo o código do ViewController, mas eu queria incluir o código delegado para aqueles que ainda não estão familiarizados com o padrão delegado (como eu). Também incluí o código para ocultar o teclado quando você toca fora da visualização de texto.
Você pode mover as visualizações (botões, campos de texto, etc.) o mais alto possível, apenas colocando-as no lugar novamente (+100 e depois -100).
fonte
Eu acho que uma maneira seria mover toda a posição de suas visualizações de (x, y) para (x, y-keybaardHeight) quando o campo de texto é clicado e colocá-lo de volta quando o teclado é descartado, pode parecer um pouco estranho, pois a visualização apenas aparece (talvez não seja ruim se você o animar).
fonte
Além da solução do Amagrammer, se você estiver usando o cocos2d no modo retrato, altere esta linha:
para isso:
Se você estiver usando o cocos2d no modo paisagem, faça as alterações acima e troque os
up
valores emtextFieldDidBeginEditing:
etextFieldDidEndEditing:
fonte
Eu tive o mesmo problema e achei o GTKeyboardHelper um caminho fácil.
Depois de arrastar e soltar a estrutura em seu projeto, inclua o arquivo de cabeçalho. Faça o download e abra o projeto de exemplo e arraste o objeto "Keyboard Helper" da seção de objetos no xib para a seção de objetos no construtor de interface do seu projeto.
Arraste e solte todas as suas visualizações para ser filho do "Keyboard Helper".
fonte
Arraste e solte a estrutura que eu uso nos meus projetos. Oferece suporte à dispensa automática quando você toca fora de uma primeira resposta ou quando você rola.
GTKeyboardHelper
fonte
Basta deslizar a visualização para cima e para baixo, conforme necessário:
Não se esqueça de definir
self
comoUITextFieldDelegate
e como o campo de texto realdelegate
.(Graças ao Ammagrammer, esta é apenas uma resposta mais curta usando blocos para animações)
fonte
Eu tenho outra coisa, se você quiser. O ponto aqui é que você deseja definir o centro da sua UIView no campo de texto que você está editando.
Antes disso, você deve salvar seu INITIAL_CENTER , como um CGPoint , de self.view.center e seu INITIAL_VIEW como um CGRect de self.view.frame em uma propriedade const.
Você pode criar um método como este:
Em seguida, no seu UITextFieldDelegate , é necessário chamar centerOn: (CGRect) nos seguintes métodos:
textFieldDidBeginEditing: (UITextField *) com, como parâmetro, o quadro do campo de texto que você deseja centralizar.
E você deve chamá-lo no seu manipulador de eventos, onde você fecha o teclado,
textFieldDidEndEditing: (UITextField *) pode ser uma das maneiras de fazer isso, colocando o INITIAL_VIEW como um parâmetro de centerOn: (CGRect) .
fonte
Acredito que nas versões mais recentes do iOS (6.1 ou superior), a visão subjacente, pelo menos para o UITableView, diminui automaticamente quando o teclado é exibido. Portanto, você só precisa tornar o campo de texto visível nessa exibição. Em
init
:então:
fonte
https://github.com/ZulwiyozaPutra/Shift-Keyboard-Example Espero que esta solução tenha ajudado. Eles são todos Swift 3 escritos.
fonte