7 votes

iPad : Détection du clavier externe

Mon application utilise un UIAccessoryView pour fournir des fonctionnalités de clavier supplémentaires (telles que les tabulations avant/arrière et les touches fléchées) pour le clavier virtuel, mais cela provoque le déclenchement de UIKeyboardDidShowNotification même lorsqu'un clavier physique est présent (l'accessoire apparaît au bas de l'écran).

J'aimerais vérifier si un clavier physique est attaché lors du traitement de la notification UIKeyboardWillShowNotification, afin d'empêcher la vue accessoire d'apparaître et d'empêcher ma vue personnalisée de défiler vers le haut (pour faire de la place au clavier virtuel inexistant).

J'ai essayé d'examiner le UIKeyboardFrameEndUserInfoKey mais il renvoie une taille réelle pour le clavier virtuel, bien que rien ne soit affiché.

Existe-t-il un moyen de détecter la présence d'un clavier physique pour éviter ce comportement indésirable ?


Hmm, l'intrigue s'épaissit.

J'ai essayé de désactiver l'accessoire de saisie en renvoyant nil de la propriété inputAccessoryView de l'objet Responder qui déclenche le clavier. Cela supprime UIKeyboardWillShowNotification y UIKeyboardDidShowNotification lorsqu'un clavier physique est présent, mais conserve ces notifications en l'absence d'un tel clavier. Tout va bien jusqu'à présent.

Ensuite, j'ai essayé de réactiver inputAccessoryView seulement après que UIKeyboardWillShowNotification a été reçu. Cela ne se produit que lorsqu'un clavier virtuel est nécessaire, ce qui devrait me permettre de réintroduire la vue accessoire dans ces circonstances. C'est du moins ce que je pensais.

Malheureusement, il semble que le système d'exploitation ne vérifie pas inputAccessoryView. après UIKeyboardWillShowNotification Il n'affiche donc pas la vue accessoire lorsqu'elle est nécessaire :o(

Cela me laisse avec deux options :

  • Inclure la vue des accessoires de saisie, ce qui donne une fonctionnalité supplémentaire aux utilisateurs de claviers virtuels, mais perdre la capacité de détecter un clavier physique et donc ne pas prendre en charge les dispositifs physiques ; ou
  • Exclure complètement l'accessoire de saisie, empêchant la plupart des utilisateurs d'accéder aux touches supplémentaires, mais permettant à l'application de fonctionner avec un clavier physique.

Ce n'est pas un grand choix, donc je suis toujours désireux de voir si quelqu'un d'autre a abordé ce problème !

8voto

StuartW Points 171

(Cette réponse a été suggérée par Sean Heber sur les forums Apple)

Lorsque vous obtenez un UIKeyboardDidShowNotification au lieu d'utiliser le cadre donné par UIKeyboardFrameEndUserInfoKey Si vous avez besoin d'une vue accessoire, vérifiez simplement où se trouve la vue accessoire de la vue et utilisez-la à la place. Tout ce que je fais, c'est de vérifier quel est le cadre de la vue accessoire et de le convertir dans l'espace de coordonnées de ma propre vue. Ensuite, je peux facilement utiliser ce cadre pour décider de ce que je dois faire.

Remarque : Lorsque le clavier à l'écran est affiché/caché à l'aide du bouton d'éjection du clavier Bluetooth, il semble que UIKit envoie UIKeyboardDidShowNotification encore mais pas un UIKeyboardWillHideNotification . Il s'agit également d'une incohérence déroutante, mais la solution de contournement ci-dessus est toujours valable, car le système modifie le cadre de l'inputAccessoryView lorsqu'il fait glisser le clavier à l'écran, de sorte que vous pouvez toujours ajuster les choses en conséquence.

2voto

Ell Neal Points 4063

Si vous inspectez le cadre dans UIKeyboardFrameEndUserInfoKey vous constaterez qu'il est décalé par la hauteur du clavier lorsqu'un clavier externe est fixé (en fait, il fait " apparaître "Vous pouvez donc la convertir dans votre espace de coordonnées local et l'intersecter avec les limites de votre vue pour trouver la hauteur visible du clavier.

- (void)keyboardWillShow:(NSNotification *)notification {

    UIView *view = [self view];
    CGRect bounds = [view bounds];
    CGRect keyboardFrame = [[notification userInfo][UIKeyboardFrameEndUserInfoKey] CGRectValue];
    CGRect convertedKeyboardFrame = [view convertRect:keyboardFrame fromView:nil];
    CGRect intersection = CGRectIntersection(convertedKeyboardFrame, bounds);

    // intersection.size.height == 0 with external keyboards
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X