Avec l'introduction de claviers personnalisés dans iOS, ce problème devient un peu plus complexe.
En bref, le UIKeyboardWillShowNotification peut être appelé plusieurs fois par des implémentations de clavier personnalisées:
- Lorsque le clavier système Apple est ouvert (en portrait)
- UIKeyboardWillShowNotification est envoyée avec une hauteur de clavier de 224
- Lorsque le clavier Swype est ouvert (en portrait):
- UIKeyboardWillShowNotification est envoyée avec une hauteur de clavier de 0
- UIKeyboardWillShowNotification est envoyée avec une hauteur de clavier de 216
- UIKeyboardWillShowNotification est envoyée avec une hauteur de clavier de 256
- Lorsque le clavier SwiftKey est ouvert (en portrait):
- UIKeyboardWillShowNotification est envoyée avec une hauteur de clavier de 0
- UIKeyboardWillShowNotification est envoyée avec une hauteur de clavier de 216
- UIKeyboardWillShowNotification est envoyée avec une hauteur de clavier de 259
Pour gérer correctement ces scénarios dans une seule ligne de code, vous devez:
Enregistrez les observateurs contre les notifications UIKeyboardWillShowNotification et UIKeyboardWillHideNotification :
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(keyboardWillShow:)
name:UIKeyboardWillShowNotification
object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(keyboardWillHide:)
name:UIKeyboardWillHideNotification
object:nil];
Créez une variable globale pour suivre la hauteur actuelle du clavier:
CGFloat _currentKeyboardHeight = 0.0f;
Implémentez keyboardWillShow pour réagir au changement actuel de la hauteur du clavier:
- (void)keyboardWillShow:(NSNotification*)notification {
NSDictionary *info = [notification userInfo];
CGSize kbSize = [[info objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue].size;
CGFloat deltaHeight = kbSize.height - _currentKeyboardHeight;
_currentKeyboardHeight = kbSize.height;
}
REMARQUE: vous souhaiterez peut-être animer le décalage des vues. Le dictionnaire d' informations contient une valeur indexée par UIKeyboardAnimationDurationUserInfoKey . Cette valeur peut être utilisée pour animer vos modifications à la même vitesse que le clavier affiché.
Implémentez keyboardWillHide à la réinitialisation _currentKeyboardHeight et réagissez au renvoi du clavier:
- (void)keyboardWillHide:(NSNotification*)notification {
NSDictionary *info = [notification userInfo];
CGSize kbSize = [[info objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue].size;
_currentKeyboardHeight = 0.0f;
}
keyboardFrameBeginRect
en coordonnées locales.