Em seguida, usei o seguinte código keyboardOnScreen:para obter acesso ao quadro do teclado. Este código obtém o userInfodicionário da notificação e acessa o NSValueassociado com UIKeyboardFrameEndUserInfoKey. Você pode então acessar o CGRect e convertê-lo para as coordenadas da visualização do seu controlador de visualização. A partir daí, você pode realizar qualquer cálculo necessário com base nesse quadro.
Embora pareça um pouco complicado, isso é certamente melhor do que codificar o tamanho do teclado. Resposta correta.
n13
2
Votou esta resposta e votou contra a questão. OP definitivamente não sabe do que está falando. Cuidado pessoal! Esta resposta é a correta!
superarts.org
2
um complemento para paisagem: if (SYSTEM_VERSION_LESS_THAN (@ "8.0")) {_keyboardHeight = keyboardFrame.size.width; } else {_keyboardHeight = keyboardFrame.size.height; }
LiangWang
3
Existe uma maneira de fazer isso sem que o teclado apareça? No meu caso, quero ter algo atrás do teclado com a mesma altura (semelhante a como os mensageiros têm as coisas)
João
@ superarts.org Não há necessidade de rejeitar a questão; as pessoas provavelmente pesquisarão por isso e agora verão esta resposta ... então está tudo bem :)
Ja͢ck
46
Lembre-se de que, com o iOS 8, o tamanho do teclado na tela pode variar. Não presuma que o teclado na tela estará sempre visível (com uma altura específica ) ou invisível.
Agora, com o iOS 8, o usuário também pode deslizar a área de previsão de texto ativada e desativada ... e, quando fizer isso, iniciará o keyboardWillShowevento de um aplicativo novamente .
Isso vai quebrar um monte de exemplos de código legado, que recomendou escrevendo um keyboardWillShowevento, que só mede a altura atual do teclado na tela, e mudando seus controles para cima ou para baixo na página, este montante (absoluto).
Em outras palavras, se você vir qualquer código de amostra, que apenas diz para você adicionar um keyboardWillShow evento, medir a altura do teclado e, em seguida, redimensionar as alturas de seus controles nesse valor, isso não funcionará mais sempre.
No meu exemplo acima, usei o código de amostra do site a seguir, que anima as restrições verticais constant valor das .
No meu aplicativo, adicionei uma restrição ao meu UITextView , definida na parte inferior da tela. Quando a tela apareceu pela primeira vez, armazenei essa distância vertical inicial.
Então, sempre que meu keyboardWillShowevento é iniciado, eu adiciono a (nova) altura do teclado a este valor de restrição original (para que a restrição redimensione a altura do controle).
Sim. É feio.
E estou um pouco chateado / surpreso que o horrivelmente doloroso AutoLayout do XCode 6 não nos permite apenas anexar a parte inferior dos controles na parte inferior da tela ou na parte superior do teclado na tela.
na verdade, o tamanho do teclado sempre varia, mesmo nas versões mais antigas do iOS. por exemplo, verificar a escrita à mão no idioma chinês
ReDetecção
Opa, não percebi isso. Achei estranho que tantos exemplos de "keyboardWillShow" sempre assumiram que esse evento seria chamado apenas uma vez quando o teclado aparecesse ou desaparecesse ... sem nenhuma funcionalidade para fazer com que o teclado permanecesse na tela, mas mudando seu tamanho.
Mike Gledhill
1
@MikeGledhill Acho que você deve usar "UIKeyboardWillChangeFrameNotification" para a mudança de quadro devido à rotação ou mostrando (/ ocultando) a barra de previsão de texto ...
Abdalrahman Shatou
Acabei de testar isso com meu aplicativo. O UIKeyboardWillChangeFrameNotification sempre é chamado ASWELL AS do evento keyboardWillShow, sempre que faço o teclado aparecer ou ligo ou desativo a área de previsão de texto. Então realmente não ajuda muito. Meu ponto é ... os usuários precisam ter um pouco de cuidado com esses eventos, só isso.
Mike Gledhill
1
Por que isso não tem muito mais atenção?
rfoo
31
A altura do teclado é de 216 pontos para o modo retrato e 162 pontos para o modo paisagem.
Se você vai postar perguntas auto-respondidas, pelo menos dê respostas decentes. O tamanho do teclado deve ser obtido a partir do objeto de notificação, não um valor embutido em código obtido de algum site. Veja aqui
jrturton
16
@jrturton A questão não é como encontrar a altura programaticamente. Esta pergunta não é útil apenas para programadores, mas também para designers gráficos e outros. A resposta que você está pedindo pertence a outra pergunta. Na verdade, há outra pergunta com essa resposta: stackoverflow.com/a/7302291/310121
Erik B
48
@ErikB Tenha cuidado. O tamanho do teclado depende do idioma e do tipo de teclado.
Gabriel
13
Para seu próprio bem, NUNCA use o valor embutido no código! Como um exemplo forte, um usuário pode estar usando o teclado dividido (duas partes), que não se importa muito com a altura.
Timo
6
Essa resposta é preguiçosa e perigosa. Obtenha a altura do teclado em UIKeyboardDidShowNotification, pois o valor real tende a mudar entre as versões principais do iOS. Veja a resposta de Ken abaixo.
Alexander
16
nota de versão: este não é mais o valor no iOS 9 e 10, pois eles suportam tamanhos de teclado personalizados.
Criei esta tabela que contém as alturas dos teclados do iPhone e do iPad, tanto no modo paisagem quanto no modo retrato, com a barra de ferramentas ligada e desligada.
Eu até expliquei como você pode usar essas dimensões em seu código aqui .
Observe que você só deve usar essas dimensões se precisar saber a dimensão do teclado antes de fazer o layout da vista. Caso contrário, as soluções das outras respostas funcionam melhor.
Respostas:
Usei a seguinte abordagem para determinar a moldura do teclado no iOS 7.1.
No método init do meu controlador de visualização, registrei-me para
UIKeyboardDidShowNotification
:NSNotificationCenter *center = [NSNotificationCenter defaultCenter]; [center addObserver:self selector:@selector(keyboardOnScreen:) name:UIKeyboardDidShowNotification object:nil];
Em seguida, usei o seguinte código
keyboardOnScreen:
para obter acesso ao quadro do teclado. Este código obtém ouserInfo
dicionário da notificação e acessa oNSValue
associado comUIKeyboardFrameEndUserInfoKey
. Você pode então acessar o CGRect e convertê-lo para as coordenadas da visualização do seu controlador de visualização. A partir daí, você pode realizar qualquer cálculo necessário com base nesse quadro.-(void)keyboardOnScreen:(NSNotification *)notification { NSDictionary *info = notification.userInfo; NSValue *value = info[UIKeyboardFrameEndUserInfoKey]; CGRect rawFrame = [value CGRectValue]; CGRect keyboardFrame = [self.view convertRect:rawFrame fromView:nil]; NSLog(@"keyboardFrame: %@", NSStringFromCGRect(keyboardFrame)); }
Rápido
E a implementação equivalente com Swift:
NotificationCenter.default.addObserver(self, selector: #selector(keyboardDidShow), name: UIResponder.keyboardDidShowNotification, object: nil) @objc func keyboardDidShow(notification: Notification) { guard let info = notification.userInfo else { return } guard let frameInfo = info[UIResponder.keyboardFrameEndUserInfoKey] as? NSValue else { return } let keyboardFrame = frameInfo.cgRectValue print("keyboardFrame: \(keyboardFrame)") }
fonte
Lembre-se de que, com o iOS 8, o tamanho do teclado na tela pode variar. Não presuma que o teclado na tela estará sempre visível (com uma altura específica ) ou invisível.
Agora, com o iOS 8, o usuário também pode deslizar a área de previsão de texto ativada e desativada ... e, quando fizer isso, iniciará o
keyboardWillShow
evento de um aplicativo novamente .Isso vai quebrar um monte de exemplos de código legado, que recomendou escrevendo um
keyboardWillShow
evento, que só mede a altura atual do teclado na tela, e mudando seus controles para cima ou para baixo na página, este montante (absoluto).Em outras palavras, se você vir qualquer código de amostra, que apenas diz para você adicionar um
keyboardWillShow
evento, medir a altura do teclado e, em seguida, redimensionar as alturas de seus controles nesse valor, isso não funcionará mais sempre.No meu exemplo acima, usei o código de amostra do site a seguir, que anima as restrições verticais
constant
valor das .Praticando AutoLayout
No meu aplicativo, adicionei uma restrição ao meu
UITextView
, definida na parte inferior da tela. Quando a tela apareceu pela primeira vez, armazenei essa distância vertical inicial.Então, sempre que meu
keyboardWillShow
evento é iniciado, eu adiciono a (nova) altura do teclado a este valor de restrição original (para que a restrição redimensione a altura do controle).Sim. É feio.
E estou um pouco chateado / surpreso que o horrivelmente doloroso AutoLayout do XCode 6 não nos permite apenas anexar a parte inferior dos controles na parte inferior da tela ou na parte superior do teclado na tela.
Talvez eu esteja faltando alguma coisa.
Além da minha sanidade.
fonte
A altura do teclado é de 216 pontos para o modo retrato e 162 pontos para o modo paisagem.
Fonte
fonte
nota de versão: este não é mais o valor no iOS 9 e 10, pois eles suportam tamanhos de teclado personalizados.
Isso depende do modelo e da barra QuickType:
http://www.idev101.com/code/User_Interface/sizes.html
fonte
A altura do teclado depende do modelo, da barra QuickType, das configurações do usuário ... A melhor abordagem é calcular dinamicamente:
Swift 3.0
var heightKeyboard : CGFloat? override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) NotificationCenter.default.addObserver(self, selector: #selector(self.keyboardShown(notification:)), name: NSNotification.Name.UIKeyboardDidShow, object: nil) } func keyboardShown(notification: NSNotification) { if let infoKey = notification.userInfo?[UIKeyboardFrameEndUserInfoKey], let rawFrame = (infoKey as AnyObject).cgRectValue { let keyboardFrame = view.convert(rawFrame, from: nil) self.heightKeyboard = keyboardFrame.size.height // Now is stored in your heightKeyboard variable } }
fonte
Não consigo encontrar a resposta mais recente, então verifico tudo com o simulador. (IOS 11.0)
Dispositivo | Altura da tela | Retrato | Panorama
iPhone 4s | 480,0 | 216,0 | 162,0
iPhone 5, iPhone 5s, iPhone SE | 568,0 | 216,0 | 162,0
iPhone 6, iPhone 6s, iPhone 7, iPhone 8, iPhone X | 667,0 | 216,0 | 162,0
iPhone 6 plus, iPhone 7 plus, iPhone 8 plus | 736,0 | 226,0 | 162,0
iPad de 5ª geração, iPad Air, iPad Air 2, iPad Pro 9.7, iPad Pro 10.5, iPad Pro 12.9 | 1024,0 | 265,0 | 353,0
Obrigado!
fonte
Iphone
Tamanho do teclado:
2.6S, 6,7,8: (375 × 667): keyboardSize = (0,0, 407,0, 375,0, 260.
3,6 +, 6S +, 7+, 8+: (414 × 736) keyboardSize = (0,0, 465,0, 414,0, 271,0)
4.XS, X: (375 X 812) keyboardSize = (0,0, 477,0, 375,0, 335,0)
5.XR, XSMAX ((414 x 896) keyboardSize = (0,0, 550,0, 414,0, 346,0)
fonte
Criei esta tabela que contém as alturas dos teclados do iPhone e do iPad, tanto no modo paisagem quanto no modo retrato, com a barra de ferramentas ligada e desligada.
Eu até expliquei como você pode usar essas dimensões em seu código aqui .
Observe que você só deve usar essas dimensões se precisar saber a dimensão do teclado antes de fazer o layout da vista. Caso contrário, as soluções das outras respostas funcionam melhor.
fonte