在iOS 9之前,确定是否连接外部键盘的最可靠方法是监听UIKeyboardWillShowNotification并将文本字段作为第一响应者,如本问题中所述.使用虚拟键盘时会触发通知,但使用外部键盘时不会触发.
但是,iOS 9现在已经改变了这种行为,UIKeyboardWillShowNotification当连接外部键盘时也会触发,因为现在显示了新的键盘工具栏.
仍然可以检测键盘高度并判断它是较小的工具栏还是正在显示的较大的虚拟键盘.然而,这种方法是不可靠的,因为键盘高度在各种beta之间已经改变,并且不能指望随着时间的推移保持不变.
有没有更可靠的方法可以用于iOS 9?
所以我有一个具有聊天部分的应用程序,我正在同步键盘的动画隐藏和显示聊天输入的上升和下降.
这是我正在使用的代码:
节目:
- (void) keyboardWillShow:(NSNotification *)note {
NSDictionary *keyboardAnimationDetail = [note userInfo];
UIViewAnimationCurve animationCurve = [keyboardAnimationDetail[UIKeyboardAnimationCurveUserInfoKey] integerValue];
CGFloat duration = [keyboardAnimationDetail[UIKeyboardAnimationDurationUserInfoKey] floatValue];
NSValue* keyboardFrameBegin = [keyboardAnimationDetail valueForKey:UIKeyboardFrameBeginUserInfoKey];
CGRect keyboardFrameBeginRect = [keyboardFrameBegin CGRectValue];
// working for hardware keyboard
//UIViewAnimationOptions options = (UIViewAnimationOptions)animationCurve;
// working for virtual keyboard
UIViewAnimationOptions options = (animationCurve << 16);
[UIView animateWithDuration:duration delay:0.0 options:options animations:^{
textView.frame = CGRectMake(0, self.view.bounds.size.height - keyboardFrameBeginRect.size.height, self.view.bounds.size.width, -40);
} completion:nil];
}
Run Code Online (Sandbox Code Playgroud)
隐藏:
- (void) keyboardWillHide:(NSNotification *)note {
NSDictionary *keyboardAnimationDetail = [note …Run Code Online (Sandbox Code Playgroud) 可能重复:
iPad:检测是否存在外部键盘
我一直在参考库中挖掘,似乎无法在这里找到答案.
我假设有一些API,我可以查询,以查明是否正在使用外部硬件键盘.
更新
我刚试过EAAccessoryManager.connectedAccessoriesExternalAccessory.framework.这是不行,它在启用硬件键盘时返回一个空数组.
我的应用程序使用a UIAccessoryView为虚拟键盘提供额外的键盘功能(例如向前/向后选项卡和箭头键),但即使存在物理键盘(附件出现在屏幕底部),也会导致UIKeyboardDidShowNotification触发.
我想检查在处理UIKeyboardWillShowNotification时是否附加物理键盘,以防止出现附件视图并防止我的自定义视图向上滚动(为不存在的虚拟键盘腾出空间).
我已经尝试过检查UIKeyboardFrameEndUserInfoKey密钥,但它会返回虚拟键盘的实际大小,尽管没有显示任何内容.
有没有办法检测物理键盘的存在,以防止这种不必要的行为?
嗯,情节变浓了.
我尝试通过从Responder对象的inputAccessoryView属性返回nil来禁用输入附件,该属性触发键盘.这会抑制UIKeyboardWillShowNotification并且UIKeyboardDidShowNotification当存在物理键盘时,但在没有这样的键盘时保留这些通知.到目前为止都很好.
然后我尝试仅在UIKeyboardWillShowNotification收到后重新启用inputAccessoryView .这仅在需要虚拟键盘时触发,因此应允许我在这些情况下重新引入附件视图.或者我想.
不幸的是,它似乎在OS不检查inputAccessoryView 之后 UIKeyboardWillShowNotification,所以它不能显示在需要的时候附属视图:O(
这让我有两个选择:
不是一个很好的选择,所以我仍然希望看到是否有其他人解决了这个问题!
可能重复:
如何检测iPad上是否存在外接键盘?
当用户开始在我的iPhone应用程序的UI中编辑文本字段时,我想使用文本字段和键盘之间的空格来获取相关选项的列表.
使用iOS上的常规(屏幕上)键盘,有几个方便的通知可以收听,这有助于我决定我在列表之间剩下多少空间.
但是,当您附加(或模拟使用)硬件键盘时,这些通知不再发布.不出意外,但这给我带来了一些挑战.如果用户使用硬件键盘,我有更多的空间用于列表.
但是,如果没有触发通知或委托方法来监听,我如何确定用户是否有硬件键盘?还是有吗?
还需要考虑的是,用户可以先使用软件键盘使用该应用程序,然后连接他/她的硬件键盘并继续使用该应用程序.此时,软件键盘将隐藏,但用户仍在编辑文本字段.
我找到了这个问题的一个老骗子,但没有答案:
与此问题类似:iPad:检测外部键盘,我正在开发一个iPad应用程序,它使用带有自定义的文本字段inputAccessoryView来为虚拟键盘提供附加功能.
但是,如果硬件键盘(例如蓝牙键盘)连接到设备,则软件键盘未按预期显示,但由于某种原因,inputAccessoryView 仍在屏幕底部可见.此外,这似乎导致触发UIKeyboardDidShowNotification(并因此移动我的视图以避免键盘实际上不存在的遮挡),即使硬件键盘用于输入.
我找到了几种解决方案来检测是否连接了硬件键盘,但是所有这些解决方案都在接收到后检查状态UIKeyboardDidShowNotification,此时inputAccessoryView已经可见(例如,我如何检测iPad上是否有外接键盘?).
我正在寻找一种方法,如果没有连接硬件键盘,只显示inputAccessoryView.因此,我需要知道,如果一个硬件键盘连接之前,一个UIKeyboardDidShowNotification被解雇了.
此处提供的已接受解决方案如何检测iPad上是否存在外接键盘?对我来说没有选择,因为他们使用私有API可能会导致我的应用被拒绝.
我真的很喜欢我的脑袋,因为当连接到iPad的蓝牙输入设备时,我无法找到显示软键盘的方法.我在网上搜索了一下,这就是结果:
埃里卡说,诀窍是回答系统"没有连接硬件键盘".我试图为UIKeyboardImpl编写一个类别,但我覆盖了:
- (BOOL)isInHardwareKeyboardMode {
DEBUG(@"is called");
return NO;
}
Run Code Online (Sandbox Code Playgroud)
但直到现在我还没有得到任何东西.调用覆盖的方法,但没有软键盘.Erica还说应用程序通过动态链接工作,但我不知道如何实现它.我不需要在AppStore,因为这是一个私人应用程序,所以我不打扰拒绝.
提前致谢
ios ×5
keyboard ×4
objective-c ×4
cocoa-touch ×2
ipad ×2
iphone ×2
uikeyboard ×2
animation ×1
ios9 ×1
xcode ×1