类似于这个问题:iPad: Detecting External Keyboard,我正在开发一个iPad应用程序,它使用带有自定义inputAccessoryView
的文本字段来为虚拟键盘提供附加功能。
但是,如果 * 硬件键盘 (例如蓝牙键盘)连接到设备时,软件键盘没有按预期显示,但由于某种原因,inputAccessoryView在屏幕底部 * 仍然可见 。此外,这似乎会引发UIKeyboardDidShowNotification
(因此向上移动我的视图以避免被实际上不存在的键盘遮挡),即使硬件键盘用于输入。
我找到了几种检测硬件键盘是否连接的解决方案,但它们都在接收UIKeyboardDidShowNotification
* 之后 * 检查状态,此时inputAccessoryView已经可见(例如How can I detect if an external keyboard is present on an iPad?)。
我正在寻找一种方法,在没有连接硬件键盘的情况下只显示inputAccessoryView。因此,我需要知道在UIKeyboardDidShowNotification
被触发之前**是否连接了硬件键盘。
这里提供的可接受的解决方案How can I detect if an external keyboard is present on an iPad?对我来说是没有选择的,因为它们使用私有API,这可能会导致我的应用程序被拒绝。
4条答案
按热度按时间exdqitrt1#
这只是@arlomedia对答案的增强,我所做的是观看willshow和didShow。
willShow我用来移动我的文本视图到适当的位置,使其移动速度与键盘相同。
我使用didShow使用上述技术检查键盘的外观大小,并相应地隐藏/显示附件InputView。
重要的是我还将该视图设置为默认隐藏,并且当收到willHide事件时,它将再次隐藏。
注意编辑以添加对userInteractionEnabled的更改,以便隐藏的附件视图不会吃掉点击。
monwx1rj2#
IIRC,当软键盘出现时,视图不会自动调整大小。我正在通过一个由UIKeyboardDidShow通知触发的keyboardDidShow方法来调整视图大小。因此,在该方法中检测硬件和软件键盘应该足够了,然后您可以跳过表格调整大小并隐藏输入辅助视图(或者调整表格大小以适应输入辅助视图,如果您更喜欢使其可见)。
无论是否存在硬件键盘,为了正确地调整视图大小,我修改了this answer中的代码:
如果你想让inputAccessoryView保持可见,这就是你所需要的。要隐藏它,我认为你需要设置一个示例变量,这样你就可以在keyboardDidShow中访问它:
b0zn9rqh3#
我解决这个问题的最后一个方法是简单地为
UIKeyboardWillShowNotification
添加一个观察者.....并隐藏先前存储在示例变量中的
inputAccessoryView
。原来这个问题是由我在getter方法中动态创建我的自定义
UITextField
子类的inputAccessoryView
引起的。我无意中在每次调用getter时重新创建了视图,而不是在惰性示例化中重用示例变量。这导致我对视图的所有赋值都被忽略,因为显然getter方法将被多次调用当访问文本字段时,键盘显示,因此视图在我的分配后被覆盖。通过将视图保存到示例变量来重用视图修复了此问题。ia2d9nvy4#
这是一个旧的线程,但截至iOS 14,我们现在有适当的API通过
GameController
框架使用GCKeyboard
和GCKeyboardDidConnect
/GCKeyboardDidDisconnect
通知跟踪硬件键盘。在这个隐藏和显示
inputAccessoryView
的特殊情况下,您可以执行如下操作: