iPad:检测外部键盘

时间:2011-02-16 16:56:12

标签: xcode ipad keyboard

我的应用使用UIAccessoryView为虚拟键盘提供额外的键盘功能(例如向前/向后标签和箭头键),但即使存在物理键盘,也会导致UIKeyboardDidShowNotification触发(附件出现)在屏幕的底部)。

我想检查在处理UIKeyboardWillShowNotification时是否附加了物理键盘,以防止出现附件视图并阻止我的自定义视图向上滚动(为不存在的虚拟键盘腾出空间)。

我已经尝试检查UIKeyboardFrameEndUserInfoKey键,但它会返回虚拟键盘的实际大小,尽管没有显示任何内容。

有没有办法检测是否存在物理键盘以防止这种不必要的行为?


嗯,情节变浓了。

我尝试通过从触发键盘的Responder对象的inputAccessoryView属性返回nil来禁用输入附件。当存在物理键盘时,这会抑制UIKeyboardWillShowNotificationUIKeyboardDidShowNotification,但在没有这样的键盘时会保留这些通知。到目前为止一切都很好。

然后我尝试仅在收到UIKeyboardWillShowNotification后重新启用inputAccessoryView。这仅在需要虚拟键盘时才会触发,因此应允许我在这些情况下重新引入附件视图。或者我想。

不幸的是,操作系统似乎没有在 UIKeyboardWillShowNotification之后检查inputAccessoryView ,因此在需要时无法显示附件视图:o(

这给我留下了两个选择:

  • 包括输入附件视图,为虚拟键盘用户提供额外功能,但无法检测物理键盘,因此无法支持物理设备;或
  • 完全排除输入附件,阻止大多数用户访问额外的密钥,但允许该应用使用物理键盘。

不是一个很好的选择,所以我仍然很想知道是否还有其他人解决了这个问题!

2 个答案:

答案 0 :(得分:8)

(这个答案是由Sean Heber在Apple论坛上提出的)

获得UIKeyboardDidShowNotification时,不要使用UIKeyboardFrameEndUserInfoKey给出的框架,而只需测试视图附件视图的位置并使用它。我所做的只是检查附件视图的框架是什么,并将其转换为我自己的视图的坐标空间。然后我可以轻松地使用该框架来决定该做什么。

注意:当使用蓝牙键盘的弹出按钮显示/隐藏屏幕键盘时,UIKit似乎再次发送UIKeyboardDidShowNotification而不是UIKeyboardWillHideNotification。这也是一个令人困惑的不一致,但上述解决方法仍然有效,因为系统将在屏幕键盘上滑动时更改inputAccessoryView的框架,因此您仍然可以相应地调整内容。

答案 1 :(得分:2)

如果你在UIKeyboardFrameEndUserInfoKey中检查框架,你会发现当连接外部键盘时它被键盘的高度偏移(基本上它是“出现”,但是永远不会出现在屏幕下方),因此您可以将其转换为本地坐标空间,并将其与视图的边界相交,以找到键盘的可见高度。

- (void)keyboardWillShow:(NSNotification *)notification {

    UIView *view = [self view];
    CGRect bounds = [view bounds];
    CGRect keyboardFrame = [[notification userInfo][UIKeyboardFrameEndUserInfoKey] CGRectValue];
    CGRect convertedKeyboardFrame = [view convertRect:keyboardFrame fromView:nil];
    CGRect intersection = CGRectIntersection(convertedKeyboardFrame, bounds);

    // intersection.size.height == 0 with external keyboards
}