ios - tamaño - teclado iphone 7
iOS 11: la altura del teclado devuelve 0 en la notificación del teclado (7)
He estado usando notificaciones de teclado sin ningún problema y obteniendo la altura exacta del teclado.
- (void)keyboardDidShow:(NSNotification *) notification{
CGSize keyboardSize = [[[notification userInfo] objectForKey:UIKeyboardFrameBeginUserInfoKey] CGRectValue].size;
NSLog(@"%f",keyboardSize.height);}
pero con iOS 11 el tamaño del teclado es 0 cuando se llama a la notificación.
¿Cuál es el problema que ocurre en este escenario? Estoy usando xcode 9 Beta 5
Calcule la altura del teclado usando el siguiente código.
Funciona tanto para dispositivos con
safe area
como para dispositivos de
safe area
non-safe area
.
@objc func keyboardWillShow(notification: Notification) {
guard let keyboardFrame = notification.userInfo[UIResponder.keyboardFrameEndUserInfoKey] as? NSValue else {
return
}
let keyboardHeight: CGFloat
if #available(iOS 11.0, *) {
let window = UIApplication.shared.keyWindow
let bottomPadding = window?.safeAreaInsets.bottom ?? 0.0
keyboardHeight = keyboardFrame.cgRectValue.height - bottomPadding
} else {
keyboardHeight = keyboardFrame.cgRectValue.height
}
}
Este problema está ocurriendo en iOS 11.
Reemplazar
"UIKeyboardFrameBeginUserInfoKey" con "UIKeyboardFrameEndUserInfoKey"
como se muestra a continuación solucionaría el problema
Código Objective-C:
CGSize keyboardSize = [[[notification userInfo] objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue].size;
Swift 2.3:
let keyboardSize = (NfnPsgVar.userInfo![UIKeyboardFrameEndUserInfoKey] as? NSValue)?.CGRectValue().size
Swift 3:
let keyboardSize = (notification.userInfo![UIKeyboardFrameEndUserInfoKey] as! NSValue).cgRectValue.size
Prueba esto:
Reemplace
UIKeyboardFrameBeginUserInfoKey
con
UIKeyboardFrameEndUserInfoKey
Reemplazar
UIKeyboardFrameBeginUserInfoKey
con
UIKeyboardFrameEndUserInfoKey
El siguiente es de Apple Docs.
UIKeyboardFrameBeginUserInfoKey: la clave para un objeto NSValue que contiene un CGRect que identifica el marco de inicio del teclado en las coordenadas de la pantalla.
UIKeyboardFrameEndUserInfoKey: la clave para un objeto NSValue que contiene un CGRect que identifica el marco final del teclado en las coordenadas de la pantalla.
Su enfoque está tratando de obtener la altura del marco antes de que se muestre, y es por eso que debería ser 0, ¡no estoy seguro de por qué no es en el primer intento! Aquí hay un ejemplo de cómo obtener correctamente la altura del teclado en Swift 4.2:
func keyboardWillShow(notification: Notification) {
guard let userInfo = notification.userInfo else { return }
guard var keyboardFrame: CGRect = (userInfo[UIResponder.keyboardFrameEndUserInfoKey] as? NSValue)?.cgRectValue else { return }
keyboardFrame = view.convert(keyboardFrame, from: nil)
let keyboardHeight = keyboardFrame.height
}
Esto proporcionará correctamente las propiedades del marco del teclado ANTES de que aparezca el teclado.
Tuve un problema similar al usar Xcode Versión 9.0 (9A235); aunque estaba usando Swift. En mi método keyboardWillShow escribí lo siguiente:
if let keyboardSize = (notification.userInfo?[UIKeyboardFrameBeginUserInfoKey] as? NSValue)?.cgRectValue {
let heightValue = keyboardSize.height
...
}
Curiosamente, la primera vez que se llamó a keyboardWillShow, heightValue fue 216.0, ¡pero durante las llamadas posteriores se había convertido en 0! Quizás este es un error de Xcode.
Reemplacé el UIKeyboardFrameBeginUserInfoKey con un UIKeyboardFrameEndUserInfoKey, y me solucionó el problema.
Utilizar esta:
CGSize keyboardSize = [[[notification userInfo] objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue].size;
Para Swift, puede usar:
let keyboardSize = (notification.userInfo![UIKeyboardFrameEndUserInfoKey] as! NSValue).cgRectValue.size