iPad:检测外部键盘

Stu*_*rtW 7 keyboard xcode ipad

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

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

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

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


嗯,情节变浓了.

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

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

不幸的是,它似乎在OS不检查inputAccessoryView 之后 UIKeyboardWillShowNotification,所以它不能显示在需要的时候附属视图:O(

这让我有两个选择:

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

不是一个很好的选择,所以我仍然希望看到是否有其他人解决了这个问题!

Stu*_*rtW 8

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

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

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