53 votes

Comment puis-je détecter si un clavier externe est présent sur un iPad?

Est-il un moyen de détecter si une externe (bluetooth ou usb) clavier est connecté à l'iPad?

35voto

KennyTM Points 232647

Indirecte et SDK-sûre est de faire un champ de texte à l'intervenant de première ligne. Si un clavier externe est présent, l' UIKeyboardWillShowNotification local notification ne doit pas être affiché.

Vous pouvez écouter l' "GSEventHardwareKeyboardAttached" (kGSEventHardwareKeyboardAvailabilityChangedNotification) Darwin notification, mais c'est une API privée, il est donc possible que votre application sera rejeté si vous utilisez ce. Pour vérifier si le matériel externe, de l'usage privé GSEventIsHardwareKeyboardAttached() fonction.

UIKit cette écoute et définit l' UIKeyboardImpl.isInHardwareKeyboardMode de la propriété en conséquence, mais la encore ce n'est privé de l'API.

29voto

user721239 Points 141

Il y a un autre niveau à ce.

  • Si vous n'avez pas de inputAccessoryView, vous n'obtiendrez pas la notification, selon les explications ci-dessus, point.
  • Toutefois, si vous avez mis en place un inputAccessoryView pour l'affichage de texte, puis vous recevrez toujours un UIKeyboard de notification lorsque les kbd est présent, la logique étant que vous aurez besoin pour animer votre point de vue dans le bon endroit, de sorte que vous besoin de l'animation de l'information contenue dans la notification.

Heureusement, il existe suffisamment d'informations dans le cas de figure si le kbd sera présenté, si c'est toujours un peu impliquées.

Si nous examinons la notification du dictionnaire, nous voyons cette information:

UIKeyboardFrameBeginUserInfoKey = NSRect: {{0, 1024}, {768, 308}}
UIKeyboardFrameEndUserInfoKey = NSRect: {{0, 980}, {768, 308}}

C'était dans le Portrait; si nous faisons tourner l'appareil à PortraitUpsideDown nous obtenons:

UIKeyboardFrameBeginUserInfoKey = NSRect: {{0, -308}, {768, 308}}
UIKeyboardFrameEndUserInfoKey = NSRect: {{0, -264}, {768, 308}}

De même, dans LandscapeLeft et LandscapeRight nous obtenons différentes de début et de fin des emplacements.

Hmm... ce que veulent dire ces chiffres? Vous pouvez voir que le kbd est hors de l'écran pour commencer, mais il ne se bougent un peu. Pour aggraver les choses, en fonction de l'orientation du périphérique, le kbd sont des endroits différents.

Toutefois, nous disposons d'assez d'informations pour comprendre ce qu'il se passe:

  1. Le kbd se déplace à partir de seulement hors de l'écran à la physique en bas de l'appareil à la même hauteur que le inputAccessoryView (mais obscurcie par il)
  2. Ainsi, dans le Portrait cas, il se déplace de 1024 à 980 -- nous devons avoir une inputAccessoryView avec une hauteur de 44 ans, qui est effectivement le cas.
  3. Ainsi, dans le Portrait si la fin y + le inputAccessoryView = hauteur= hauteur de l'écran, puis le kbd n'est pas visible. Vous devez traiter les autres rotations, mais c'est l'idée.

8voto

T.J. Points 2711

Bâtiment sur @user721239 si la condition détermine si la partie inférieure du clavier est hors de l'image de soi.vue". convertRect" normalise le cadre de n'importe quelle orientation.

- (void)keyboardWillShow:(NSNotification *)notification {
keyboardFrame = [[[notification userInfo] objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue];
keyboardFrame = [self.view convertRect:keyboardFrame fromView:nil]; // convert orientation
keyboardSize = keyboardFrame.size;
//NSLog(@"keyboardFrame.origin.y = %f", keyboardFrame.origin.y);
//NSLog(@"keyboardFrame.size.height = %f", keyboardFrame.size.height);
BOOL hardwareKeyboardPresent = FALSE;;
if ((keyboardFrame.origin.y + keyboardFrame.size.height) > (self.view.frame.size.height+self.navigationController.navigationBar.frame.size.height)) {
    hardwareKeyboardPresent = TRUE;
}
//NSLog(@"bottomOfKeyboard = %f", bottomOfKeyboard);
//NSLog(@"self.view.frame.size.height = %f", self.view.frame.size.height);

5voto

user1172004 Points 157

Même à l'aide d'un inputAccessoryView sur votre UITextView instance définie à une instance d'une UIView avec cadre CGRectZero travaille pour obtenir la livraison du clavier notifications de travail avec un clavier matériel.

4voto

Philosophistry Points 370

C'est le code que j'utilise pour obtenir la hauteur à partir du clavier userInfo en UIKeyboardWillShowNotification. Fonctionne si à la fois physique et virtuelle claviers.

NSValue* aValue = [userInfo objectForKey:UIKeyboardFrameEndUserInfoKey];

CGRect keyboardRect = [aValue CGRectValue];

CGFloat deviceHeight = [UIScreen mainScreen].bounds.size.height;
CGFloat deviceWidth = [UIScreen mainScreen].bounds.size.width;

CGFloat newKeyboardHeight;

if (interfaceOrientation == UIInterfaceOrientationPortrait)
    newKeyboardHeight = deviceHeight - keyboardRect.origin.y;
else if (interfaceOrientation == UIInterfaceOrientationPortraitUpsideDown)
    newKeyboardHeight = keyboardRect.size.height + keyboardRect.origin.y;
else if (interfaceOrientation == UIInterfaceOrientationLandscapeLeft)
    newKeyboardHeight = deviceWidth - keyboardRect.origin.x;
else
    newKeyboardHeight = keyboardRect.size.width + keyboardRect.origin.x;

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