teclados teclado tamaño pro para configurar como color cambiar aumentar aparece acomodar ios objective-c keyboard ios9

tamaño - ¿Cómo detectar de manera confiable si un teclado externo está conectado a iOS 9?



teclado iphone 7 (6)

Antes de iOS 9, el método más confiable para determinar si un teclado externo está conectado era escuchar UIKeyboardWillShowNotification y convertir un campo de texto en el primer respondedor, como se discutió en esta pregunta . La notificación se activará al usar el teclado virtual, pero no se disparará cuando se use un teclado externo.

Sin embargo, este comportamiento ahora ha cambiado con iOS 9. UIKeyboardWillShowNotification también se UIKeyboardWillShowNotification cuando se conecta un teclado externo, ya que ahora se muestra la nueva barra de herramientas del teclado.

Todavía es posible detectar la altura del teclado y juzgar si se muestra la barra de herramientas más pequeña o el teclado virtual más grande. Sin embargo, este método no es confiable ya que la altura del teclado ha cambiado entre las diversas versiones beta y no se puede contar para que permanezca igual a lo largo del tiempo.

¿Existe algún método más confiable que pueda usarse con iOS 9?


Después de volver a la pregunta original, he encontrado una solución que funciona.

Parece que cuando se muestra el teclado virtual normal, el marco del teclado está dentro de las dimensiones de la pantalla. Sin embargo, cuando se conecta un teclado físico y se muestra la barra de herramientas del teclado, el marco del teclado se encuentra fuera de la pantalla. Podemos verificar si el marco del teclado está fuera de la pantalla para determinar si se muestra la barra de herramientas del teclado.

- (void) keyboardWillShow:(NSNotification *)notification { NSDictionary* userInfo = [notification userInfo]; CGRect keyboardFrame = [[userInfo objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue]; CGRect keyboard = [self.view convertRect:keyboardFrame fromView:self.view.window]; CGFloat height = self.view.frame.size.height; if ((keyboard.origin.y + keyboard.size.height) > height) { self.hasKeyboard = YES; } }


Este código es compatible con iOS 8 y iOS 9, inputAccessoryView, tiene una constante de doble protección para estar listo para nuevos cambios en futuras versiones de iOS y para admitir nuevos dispositivos:

#define gThresholdForHardwareKeyboardToolbar 160.f // it''s minimum height of the software keyboard on non-retina iPhone in landscape mode - (bool)isHardwareKeyboardUsed:(NSNotification*)keyboardNotification { NSDictionary* info = [keyboardNotification userInfo]; CGRect keyboardEndFrame; [[info valueForKey:UIKeyboardFrameEndUserInfoKey] getValue:&keyboardEndFrame]; float height = [[UIScreen mainScreen] bounds].size.height - keyboardEndFrame.origin.y; return height < gThresholdForHardwareKeyboardToolbar; }

Tenga en cuenta, un teclado de hardware puede presentar pero no se utiliza.


Estoy usando una variación en la respuesta de Sarah Elan. Estaba teniendo problemas con su enfoque en ciertos puntos de vista. Nunca llegué al fondo de lo que causó el problema. Pero aquí hay otra forma de determinar si tiene una barra de ''deshacer'' del teclado externo ios9, en lugar del teclado de tamaño completo.

Probablemente no sea muy compatible con versiones anteriores, ya que si cambian el tamaño de la barra de deshacer, este frena. Pero, hizo el trabajo. Doy la bienvenida a las críticas ya que debe haber una mejor manera ...

//... somewhere ... #define HARDWARE_KEYBOARD_SIZE_IOS9 55 // + (BOOL) isExternalKeyboard:(NSNotification*)keyboardNotification { NSDictionary* info = [keyboardNotification userInfo]; CGRect keyboardEndFrame; [[info valueForKey:UIKeyboardFrameEndUserInfoKey] getValue:&keyboardEndFrame]; CGRect keyboardBeginFrame; [[info valueForKey:UIKeyboardFrameBeginUserInfoKey] getValue:&keyboardBeginFrame]; CGFloat diff = keyboardEndFrame.origin.y - keyboardBeginFrame.origin.y; return fabs(diff) == HARDWARE_KEYBOARD_SIZE_IOS9; }


Puede intentar verificar los periféricos que son servicios de publicidad usando Core Bluetooth

CBCentralManager *centralManager = [[CBCentralManager alloc] initWithDelegate:self queue:nil]; [centralManager scanForPeripheralsWithServices:nil options:nil];

Y debes implementar al delegado:

- (void)centralManager:(CBCentralManager * _Nonnull)central didDiscoverPeripheral:(CBPeripheral * _Nonnull)peripheral advertisementData:(NSDictionary<NSString *, id> * _Nonnull)advertisementData RSSI:(NSNumber * _Nonnull)RSSI{ }


Puede suscribirse a la notificación cuando el dispositivo externo está conectado:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(deviceConnected:) name:EAAccessoryDidConnectNotification object:nil]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(deviceDisconnected:) name:EAAccessoryDidDisconnectNotification object:nil]; [[EAAccessoryManager sharedAccessoryManager] registerForLocalNotifications];

O simplemente recupere la lista de dispositivos adjuntos:

EAAccessoryManager* accessoryManager = [EAAccessoryManager sharedAccessoryManager]; if (accessoryManager) { NSArray* connectedAccessories = [accessoryManager connectedAccessories]; NSLog(@"ConnectedAccessories = %@", connectedAccessories); }


Solución de API privada: (tiene que tomar el archivo de encabezado privado - use RuntimeViewer).

Funciona bien para aplicaciones empresariales, donde no tiene restricciones de AppStore.

#import "UIKit/UIKeyboardImpl.h" + (BOOL)isHardwareKeyboardMode { UIKeyboardImpl *kbi = [UIKeyboardImpl sharedInstance]; BOOL externalKeyboard = kbi.inHardwareKeyboardMode; NSLog(@"Using external keyboard? %@", externalKeyboard?@"YES":@"NO"); return externalKeyboard; }