UIAccessoryView
来提供额外的键盘功能(例如向前/向后选项卡和箭头键)以供虚拟键盘使用,但这会导致在存在物理键盘时(附件显示在屏幕底部)触发 UIKeyboardDidShowNotification 。
我想在处理 UIKeyboardWillShowNotification 时检查是否连接了物理键盘,以防止辅助视图出现并防止我的自定义视图向上滚动(为不存在的虚拟键盘腾出空间)。
我尝试检查 UIKeyboardFrameEndUserInfoKey
键,但它返回虚拟键盘的实际大小,尽管没有任何内容被显示。
有没有办法检测物理键盘的存在以防止这种不必要的行为呢?
嗯,情况变得更加复杂了。
我尝试通过从触发键盘的 Responder 对象的 inputAccessoryView 属性返回 nil 来禁用输入辅助视图。当存在物理键盘时,这将抑制 UIKeyboardWillShowNotification
和 UIKeyboardDidShowNotification
,但在没有这样的键盘时保留这些通知。到目前为止都很好。
然后我尝试在接收到 UIKeyboardWillShowNotification
后重新启用 inputAccessoryView。这仅在需要虚拟键盘时才会触发,因此它应该允许我在这些情况下重新引入附件视图。或者至少我是这么想的。
不幸的是,似乎操作系统在 UIKeyboardWillShowNotification
之后不会检查 inputAccessoryView,因此当需要显示附件视图时,它无法显示 :o(
这让我有两个选择:
- 包括输入辅助视图,为虚拟键盘用户提供额外的功能,但失去检测物理键盘的能力,因此不支持物理设备;或者
- 完全排除输入辅助视图,防止大多数用户访问额外的键,但允许应用程序与物理键盘配合使用。
这不是一个很好的选择,所以我仍然希望看看是否有其他人解决了这个问题!
UIKeyboardFrameEndUserInfoKey
没有显示键盘在屏幕上真正的显示框架,那么它就没什么用了。我会在 Apple 的 bugreporter 上报告这个问题。 - GorillaPatch