如何检测iPad上是否有外接键盘?

car*_*loe 52 keyboard ipad ios

有没有办法检测外部(蓝牙或USB)键盘是否连接到iPad?

ken*_*ytm 36

间接和SDK安全的方法是使文本字段成为第一响应者.如果存在外部键盘,则UIKeyboardWillShowNotification不应发布本地通知.

更新:自iOS 9以来不再适用,但您可以使用键盘尺寸来确定是否涉及硬件或软件键盘.请参阅如何可靠地检测iOS 9上是否连接了外部键盘?详情.

您可以收听"GSEventHardwareKeyboardAttached"(kGSEventHardwareKeyboardAvailabilityChangedNotification)Darwin通知,但这是一个私有API,因此如果您使用此应用程序,您的应用程序可能会被拒绝.要检查外部硬件是否存在,请使用私有GSEventIsHardwareKeyboardAttached()功能.

UIKit会监听并相应地设置UIKeyboardImpl.isInHardwareKeyboardMode属性,但这又是私有API.

  • 旧评论,但在iOS 9上提及,即使连接了外部键盘,也会触发UIKeyboardWillShowNotification,这是一件好事.这是因为iOS 9在虚拟键盘上引入了一个工具栏,其中包含粘贴/撤消/重做操作,即使连接了外部键盘也会显示. (15认同)
  • 我想指出,当你有一个accessoryView集时,总会调用WillShowNotification.因此,如果您尝试测试是否显示accessoryView,这将无法正常工作. (7认同)
  • 公共电话无法做到这一点吗?让我的应用程序被拒绝有点失败了写它的目的首先=) (4认同)
  • 那么现在如何为iOS9做这个呢? (4认同)
  • 有关如何为iOS9执行此操作的讨论,请参见http://stackoverflow.com/q/31991873/1873374. (4认同)
  • @carloe:您可以收听UIKeyboard [Will | Did] [Show | Hide]通知通知并相应调整视图的位置,就像iPhone上的所有人一样(键盘出现和消失时)...... (2认同)

use*_*239 28

还有另一个层面.

  • 如果您没有inputAccessoryView,则不会像上面的解释所指出的那样收到通知.
  • 但是,如果您为文本视图设置了inputAccessoryView,那么当外部kbd存在时您仍会收到UIKeyboard通知 - 逻辑是您需要将视图设置为正确的位置,以便您需要动画通知中包含的信息.

幸运的是,事件中有足够的信息来确定是否会出现kbd,尽管它仍然有点牵扯.

如果我们检查通知字典,我们会看到以下信息:

UIKeyboardFrameBeginUserInfoKey = NSRect: {{0, 1024}, {768, 308}}
UIKeyboardFrameEndUserInfoKey = NSRect: {{0, 980}, {768, 308}}
Run Code Online (Sandbox Code Playgroud)

那是在肖像; 如果我们将设备旋转到PortraitUpsideDown,我们得到:

UIKeyboardFrameBeginUserInfoKey = NSRect: {{0, -308}, {768, 308}}
UIKeyboardFrameEndUserInfoKey = NSRect: {{0, -264}, {768, 308}}
Run Code Online (Sandbox Code Playgroud)

类似地,在LandscapeLeft和LandscapeRight中,我们获得不同的开始和结束位置.

嗯......这些数字是什么意思?您可以看到kbd在屏幕外启动,但它确实移动了一点.更糟糕的是,根据设备方向,kbd位置不同.

但是,我们确实有足够的信息来确定发生了什么:

  1. kbd从设备物理底部的屏幕外移动到与inputAccessoryView相同的高度(但被它遮挡)
  2. 所以在Portrait情况下,它从1024移动到980 - 我们必须有一个高度为44的inputAccessoryView,的确如此.
  3. 所以在Portrait中如果结束y + inputAccessoryView height ==屏幕高度,则kbd不可见.你需要处理其他轮换,但这就是主意.


T.J*_*.J. 8

在@ user721239的基础上,if条件确定键盘的底部是否超出self.view的框架."convertRect"规范化任何方向的框架.

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


use*_*004 5

即使在UITextView实例上使用inputAccessoryView设置为带有框架CGRectZero的UIView实例,也可以使用硬件键盘传递键盘通知.