He estado usando las notificaciones del 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
Reemplazar
UIKeyboardFrameBeginUserInfoKey
con
UIKeyboardFrameEndUserInfoKey
El siguiente es de Apple Docs.
fuente
Prueba esto:
Reemplazar
UIKeyboardFrameBeginUserInfoKey
conUIKeyboardFrameEndUserInfoKey
fuente
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillChangeFrame:) name:UIKeyboardWillChangeFrameNotification object:nil];
el método keyboardWillChangeFrame: no solo se ejecuta una vez, tal vez dos o más. Tal vez algún teclado tenga una barra de herramientas especial en la parte superior a veces, el método se ejecutará muchas veces en este momento. Por lo tanto, debe reemplazar UIKeyboardFrameBeginUserInfoKey con UIKeyboardFrameEndUserInfoKey para obtener el marco final de 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 era 216.0, ¡pero durante llamadas posteriores se había convertido en 0! Quizás este sea un error de Xcode.
Reemplacé el UIKeyboardFrameBeginUserInfoKey con un UIKeyboardFrameEndUserInfoKey, y me solucionó el problema.
fuente
Este problema ocurre en iOS 11.
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
fuente
Calcule la altura del teclado usando el siguiente código.
Código:
@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 } }
fuente
Su enfoque está tratando de obtener la altura del marco antes de que se muestre, y es por eso que debería ser 0, ¡lo cual 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.
fuente