Con la introducción de teclados personalizados en iOS, este problema se vuelve un poco más complejo.
En resumen, la UIKeyboardWillShowNotification puede ser llamada varias veces por implementaciones de teclado personalizadas:
- Cuando se abre el teclado del sistema Apple (en vertical)
- UIKeyboardWillShowNotification se envía con una altura de teclado de 224
- Cuando se abre el teclado Swype (en vertical):
- UIKeyboardWillShowNotification se envía con una altura de teclado de 0
- UIKeyboardWillShowNotification se envía con una altura de teclado de 216
- UIKeyboardWillShowNotification se envía con una altura de teclado de 256
- Cuando se abre el teclado SwiftKey (en vertical):
- UIKeyboardWillShowNotification se envía con una altura de teclado de 0
- UIKeyboardWillShowNotification se envía con una altura de teclado de 216
- UIKeyboardWillShowNotification se envía con una altura de teclado de 259
Para manejar estos escenarios correctamente en una línea de código, necesita:
Registre observadores en las notificaciones UIKeyboardWillShowNotification y UIKeyboardWillHideNotification :
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(keyboardWillShow:)
name:UIKeyboardWillShowNotification
object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(keyboardWillHide:)
name:UIKeyboardWillHideNotification
object:nil];
Cree una variable global para rastrear la altura actual del teclado:
CGFloat _currentKeyboardHeight = 0.0f;
Implemente keyboardWillShow para reaccionar al cambio actual en la altura del teclado:
- (void)keyboardWillShow:(NSNotification*)notification {
NSDictionary *info = [notification userInfo];
CGSize kbSize = [[info objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue].size;
CGFloat deltaHeight = kbSize.height - _currentKeyboardHeight;
_currentKeyboardHeight = kbSize.height;
}
NOTA: Es posible que desee animar la compensación de vistas. El diccionario de información contiene un valor introducido por UIKeyboardAnimationDurationUserInfoKey . Este valor puede usarse para animar sus cambios a la misma velocidad que el teclado que se muestra.
Implemente keyboardWillOcultar al reinicio _currentKeyboardHeight y reaccionar cuando se descarte el teclado:
- (void)keyboardWillHide:(NSNotification*)notification {
NSDictionary *info = [notification userInfo];
CGSize kbSize = [[info objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue].size;
_currentKeyboardHeight = 0.0f;
}
keyboardFrameBeginRect
a coordenadas locales.