如何可靠地检测iOS 9上是否连接了外接键盘?

Sar*_*lan 32 keyboard objective-c ios ios9

在iOS 9之前,确定是否连接外部键盘的最可靠方法是监听UIKeyboardWillShowNotification并将文本字段作为第一响应者,如本问题中所述.使用虚拟键盘时会触发通知,但使用外部键盘时不会触发.

但是,iOS 9现在已经改变了这种行为,UIKeyboardWillShowNotification当连接外部键盘时也会触发,因为现在显示了新的键盘工具栏.

仍然可以检测键盘高度并判断它是较小的工具栏还是正在显示的较大的虚拟键盘.然而,这种方法是不可靠的,因为键盘高度在各种beta之间已经改变,并且不能指望随着时间的推移保持不变.

有没有更可靠的方法可以用于iOS 9?

Sar*_*lan 50

回到最初的问题后,我找到了一个有效的解决方案.

似乎当显示常规虚拟键盘时,键盘框架在屏幕的尺寸内.但是,当连接物理键盘并显示键盘工具栏时,键盘框架位于屏幕外.我们可以检查键盘框架是否在屏幕外以确定是否显示键盘工具栏.

- (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;
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 谢谢!要在iOS9上计算键盘的工具栏高度:`CGFloat toolbarHeight = height - keyboard.origin.y` (4认同)
  • 我在iOS 11 iPad上进行了测试,并且`keyboard.origin.y + keyboard.size.height`的结果值等于`self.view.frame.size.height`; 但是,我发现所有情况下`keyboard.size.height`等于55 (3认同)
  • 我测试了iOS 12.1新版iPads Pro,工具栏高度为69,所以并不是所有情况下都为55。 (3认同)
  • 出于某种原因,这在第一次运行时效果很好,但是如果我解雇并拉回键盘,它就无法正确计算,并说有未连接的键盘。 (2认同)

kam*_*ala 10

iOS版SDK 14终于带来了公共API: GCKeyboard。要检查是否连接了外接键盘:

let isKeyboardConnected = GCKeyboard.coalesced != nil
Run Code Online (Sandbox Code Playgroud)

笔记:

  • import GameController
  • 你可能需要把它附在 if #available(iOS 14.0, *)

  • 对于智能键盘保护套,将键盘连接到设备会使上述返回 true,即使键盘向后折叠也是如此。然而,Grammarly 还可以通过将设备对接到其磁性底座来检测键盘何时被激活。 (2认同)

Dmi*_*try 5

该代码支持iOS 8和iOS 9,inputAccessoryView,具有双重保护的常量,以准备在将来的iOS版本中进行新更改并支持新设备:

#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;
}
Run Code Online (Sandbox Code Playgroud)

请注意,可能存在但未使用硬件键盘。