A altura em retrato e a altura em paisagem medidas em pontos.
A altura em retrato e a altura em paisagem medidas em pontos.
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 o userInfo
dicionário da notificação e acessa o NSValue
associado 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.
-(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)")
}
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 .
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.
A altura do teclado é de 216 pontos para o modo retrato e 162 pontos para o modo paisagem.
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:
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
}
}
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!
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)
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.