Est-il un moyen de détecter si une externe (bluetooth ou usb) clavier est connecté à l'iPad?
Réponses
Trop de publicités?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.
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:
- 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)
- 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.
- 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.
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);
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;