我的应用程序使用UIAccessoryView为虚拟键盘提供额外的键盘功能(例如向前/向后的选项卡和箭头键),但这会导致UIKeyboardDidShowNotification启动,即使在物理键盘存在时(附件出现在屏幕底部)。
我想检查在处理UIKeyboardWillShowNotification时是否附加了物理键盘,以防止附件视图的出现,并防止我的自定义视图滚动(为不存在的虚拟键盘腾出空间)。
我试过检查UIKeyboardFrameEndUserInfoKey键,但它返回虚拟键盘的实际大小,尽管没有显示任何内容。
有没有任何方法可以检测到物理键盘的存在,以防止这种不必要的行为?
嗯,情节更复杂了。
我尝试通过从触发键盘的Responder对象的inputAccessoryView属性返回nil来禁用输入附件。当存在物理键盘时,这会抑制UIKeyboardWillShowNotification和UIKeyboardDidShowNotification,但在没有这样的键盘时保留这些通知。目前为止一切都很好。
然后,我尝试重新启用inputAccessoryView后,只有在UIKeyboardWillShowNotification已经收到。这只会在需要虚拟键盘时触发,因此应该允许我在这些情况下重新引入附件视图。或者我是这样想的。
不幸的是,操作系统似乎没有在inputAccessoryView之后检查UIKeyboardWillShowNotification,因此它无法在需要时显示附件视图:o(
这让我有两个选择:
不是一个很好的选择,所以我仍然热衷于看看是否有其他人已经解决了这个问题!
发布于 2011-03-29 05:08:50
(这个答案是肖恩·希伯在苹果论坛上提出的)
当您得到一个UIKeyboardDidShowNotification时,不要使用UIKeyboardFrameEndUserInfoKey给出的框架,只需测试视图的附件视图在哪里,然后使用它。我所做的就是检查附件视图的框架是什么,并将其转换为我自己视图的坐标空间。然后我就可以很容易地用这个框架来决定该做什么。
注意:当使用蓝牙键盘的弹出按钮显示/隐藏屏幕上的键盘时,UIKit似乎再次发送UIKeyboardDidShowNotification,而不是UIKeyboardWillHideNotification。这也是一个令人困惑的不一致,但上述解决办法仍然有效,因为系统将改变inputAccessoryView的框架时,它在屏幕上的键盘滑动,所以你仍然可以相应地调整事情。
发布于 2015-03-29 14:34:02
如果您检查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
}https://stackoverflow.com/questions/5019471
复制相似问题