webentwicklung-frage-antwort-db.com.de

Wie erkennt man zuverlässig, ob eine externe Tastatur unter iOS 9 angeschlossen ist?

Vor iOS 9 bestand die zuverlässigste Methode, um zu bestimmen, ob eine externe Tastatur angeschlossen ist, darin, auf UIKeyboardWillShowNotification zu achten und ein Textfeld als Ersthelfer festzulegen, wie in diese Frage erläutert. Die Benachrichtigung wird bei Verwendung der virtuellen Tastatur ausgelöst, bei einer externen Tastatur jedoch nicht.

Mit iOS 9 hat sich dieses Verhalten jedoch geändert. UIKeyboardWillShowNotification wird auch ausgelöst, wenn eine externe Tastatur angeschlossen ist, da jetzt die neue Tastatursymbolleiste angezeigt wird.

Es ist immer noch möglich, die Höhe der Tastatur zu ermitteln und zu beurteilen, ob die kleinere Symbolleiste oder die größere virtuelle Tastatur angezeigt wird. Diese Methode ist jedoch nicht zuverlässig, da sich die Tastaturhöhe zwischen den verschiedenen Beta-Versionen geändert hat und nicht davon ausgegangen werden kann, dass sie im Laufe der Zeit gleich bleibt. 

Gibt es eine zuverlässigere Methode, die mit iOS 9 verwendet werden kann?

30
Sarah Elan

Nach der Rückkehr zur ursprünglichen Frage habe ich eine Lösung gefunden, die funktioniert. 

Es scheint, dass sich der Tastaturrahmen bei Anzeige der normalen virtuellen Tastatur innerhalb der Bildschirmabmessungen befindet. Wenn jedoch eine physische Tastatur angeschlossen ist und die Tastatursymbolleiste angezeigt wird, befindet sich der Tastaturrahmen außerhalb des Bildschirms. Wir können überprüfen, ob sich der Tastaturrahmen außerhalb des Bildschirms befindet, um festzustellen, ob die Tastatursymbolleiste angezeigt wird.

- (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;
    }
}
47
Sarah Elan

Dieser Code unterstützt iOS 8 und iOS 9, inputAccessoryView, hat doppelt geschützte Konstante, um für neue Änderungen in zukünftigen iOS-Versionen bereit zu sein und neue Geräte zu unterstützen:

#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;
}

Beachten Sie, dass möglicherweise eine Hardwaretastatur vorhanden, jedoch nicht verwendet wird.

4
Dmitry

Private API-Lösung: (Sie müssen sich die private Header-Datei holen - verwenden Sie RuntimeViewer).

Funktioniert gut für Unternehmensanwendungen, für die keine AppStore-Einschränkungen gelten.

#import "UIKit/UIKeyboardImpl.h"

+ (BOOL)isHardwareKeyboardMode
{
   UIKeyboardImpl *kbi = [UIKeyboardImpl sharedInstance];
   BOOL externalKeyboard = kbi.inHardwareKeyboardMode;
   NSLog(@"Using external keyboard? %@", [email protected]"YES":@"NO");
   return externalKeyboard;
}
2
Simon Tillson

Ich verwende eine Variante der Antwort von Sarah Elan. Ich hatte in bestimmten Ansichten Probleme mit ihrem Ansatz. Ich bin dem Problem nie ganz auf den Grund gegangen. Es gibt jedoch eine andere Methode, um festzustellen, ob es sich bei Ihrer ios9-Tastatur um eine Undo-Leiste handelt, und nicht um eine Tastatur in voller Größe.

Es ist wahrscheinlich nicht sehr vorwärtskompatibel, da diese Bremsen bremsen, wenn sie die Größe der Undo-Leiste verändern. Aber es wurde erledigt. Ich freue mich über Kritik, da es einen besseren Weg geben muss ...

//... 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;
}
2
Mike

Wenn Sie die Symbolleiste irrelevant machen, wird die Tastatur nicht angezeigt. Deaktivieren Sie dazu die linke und rechte Gruppe (zumindest unter iOS 12.4):

textField.inputAssistantItem.leadingBarButtonGroups = []
textField.inputAssistantItem.trailingBarButtonGroups = []

... und für den Fall, dass es hilft, ist hier ein schneller Weg zu beobachten:

// Watch for a soft keyboard to show up
let observer = NotificationCenter.default.addObserver(forName: UIWindow.keyboardWillShowNotification, object: nil, queue: nil) { notification in
    print("no external keyboard")
}

// Stop observing shortly after, since the keyboard should have shown by now
DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) {
    NotificationCenter.default.removeObserver(observer)
}
1
garafajon

Sie können eine Benachrichtigung abonnieren, wenn das externe Gerät angeschlossen ist:

[[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];

Oder rufen Sie einfach die Liste der angeschlossenen Geräte ab:

EAAccessoryManager* accessoryManager = [EAAccessoryManager sharedAccessoryManager];

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