Quelques observations:
Le modèle recommandé pour un objet singleton serait le suivant. dispatch_once s'assure que la classe est initialisée une fois de manière thread-safe et que la variable statique n'est pas visible à l'extérieur. Et c'est un GCD standard, donc pas besoin de connaître les détails de bas niveau d'Objective-C.
+ (KeyboardStateListener *)sharedInstance
{
static KeyboardStateListener* shared;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
shared = [[KeyboardStateListener alloc] init];
// Other initialisations
});
return shared;
}
Habituellement, vous ne voulez pas savoir si le clavier est visible ou non, mais quelle est sa taille. Les claviers n'ont pas tous la même taille. Les claviers iPhone sont plus petits que les claviers iPad. Vous voudriez donc une autre propriété @property (readonly, nonatomic) CGRect keyboardRect;
définie dans la méthode noticeShowKeyboard: comme celle-ci:
NSValue* value = notification.userInfo [UIKeyboardFrameEndUserInfoKey];
_keyboardRect = value.CGRectValue;
Il est important de noter que le rectangle est en coordonnées UIWindow et ne respecte pas la rotation de l'écran. Ainsi, l'appelant convertirait ce rectangle en appelant
KeyboardStateListener* listener = [KeyboardStateListener sharedInstance];
CGRect windowRect = listener.keyboardRect;
CGRect viewRect = [myView convertRect:windowRect fromView:self.window];
Si l'utilisateur fait pivoter l'écran alors que le clavier est visible, l'application sera informée que le clavier est masqué, puis affichée à nouveau. Lorsqu'il est affiché, les autres vues ne sont probablement pas encore pivotées. Donc, si vous observez vous-même les événements de masquage / affichage du clavier, convertissez les coordonnées lorsque vous en avez réellement besoin, pas dans la notification.
Si l'utilisateur divise ou déverrouille le clavier, ou utilise un clavier matériel, les notifications afficheront toujours le clavier comme masqué. Le désancrage ou la fusion du clavier enverra une notification «clavier affiché».
L'auditeur doit être initialisé alors que le clavier est masqué, sinon la première notification sera manquée, et on supposera que le clavier est masqué quand ce n'est pas le cas.
Il est donc très important de savoir ce que vous voulez réellement. Ce code est utile pour déplacer les choses hors du chemin du clavier (avec un clavier partagé ou non ancré, c'est la responsabilité de l'utilisateur). Il ne vous dit pas si l'utilisateur peut voir un clavier à l'écran (en cas de clavier partagé). Il ne vous dit pas si l'utilisateur peut taper (par exemple quand il y a un clavier matériel). Regarder d'autres fenêtres ne fonctionne pas si l'application crée elle-même d'autres fenêtres.