为了账号安全,请及时绑定邮箱和手机立即绑定

如何检测iPad上是否有外接键盘?

/ 猿问

如何检测iPad上是否有外接键盘?

慕码人2483693 2019-08-19 14:10:17

如何检测iPad上是否有外接键盘?

有没有办法检测外部(蓝牙或USB)键盘是否连接到iPad?



查看完整描述

3 回答

?
翻过高山走不出你

间接和SDK安全的方法是使文本字段成为第一响应者。如果存在外部键盘,则UIKeyboardWillShowNotification不应发布本地通知。

更新:自iOS 9以来不再适用,但您可以使用键盘尺寸来确定是否涉及硬件或软件键盘。

您可以收听"GSEventHardwareKeyboardAttached"kGSEventHardwareKeyboardAvailabilityChangedNotification)Darwin通知,但这是一个私有API,因此如果您使用此应用程序,您的应用程序可能会被拒绝。要检查外部硬件是否存在,请使用私有GSEventIsHardwareKeyboardAttached()功能。

UIKit会监听并相应地设置UIKeyboardImpl.isInHardwareKeyboardMode属性,但这又是私有API。


查看完整回答
反对 回复 2019-08-19
?
慕田峪4524236

还有另一个层面。

  • 如果您没有inputAccessoryView,则不会像上面的解释所指出的那样收到通知。

  • 但是,如果您为文本视图设置了inputAccessoryView,那么当外部kbd存在时您仍会收到UIKeyboard通知 - 逻辑是您需要将视图设置为正确的位置,以便您需要动画通知中包含的信息。

幸运的是,事件中有足够的信息来确定是否会出现kbd,尽管它仍然有点牵扯。

如果我们检查通知字典,我们会看到以下信息:

UIKeyboardFrameBeginUserInfoKey = NSRect: {{0, 1024}, {768, 308}}UIKeyboardFrameEndUserInfoKey = NSRect: {{0, 980}, {768, 308}}

那是在肖像; 如果我们将设备旋转到PortraitUpsideDown,我们得到:

UIKeyboardFrameBeginUserInfoKey = NSRect: {{0, -308}, {768, 308}}UIKeyboardFrameEndUserInfoKey = NSRect: {{0, -264}, {768, 308}}

类似地,在LandscapeLeft和LandscapeRight中,我们得到不同的开始和结束位置。

嗯......这些数字是什么意思?您可以看到kbd在屏幕外启动,但它确实移动了一点。更糟糕的是,根据设备方向,kbd位置不同。

但是,我们确实有足够的信息来确定发生了什么:

  1. kbd从设备物理底部的屏幕外移动到与inputAccessoryView相同的高度(但被它遮挡)

  2. 所以在Portrait情况下,它从1024移动到980 - 我们必须有一个高度为44的inputAccessoryView,的确如此。

  3. 所以在Portrait中如果结束y + inputAccessoryView height ==屏幕高度,则kbd不可见。你需要处理其他轮换,但这就是主意。


查看完整回答
反对 回复 2019-08-19
?
神不在的星期二

if条件确定键盘的底部是否超出self.view的框架。“convertRect”规范化任何方向的框架。


- (void)keyboardWillShow:(NSNotification *)notification {

keyboardFrame = [[[notification userInfo] objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue];

keyboardFrame = [self.view convertRect:keyboardFrame fromView:nil]; // convert orientation

keyboardSize = keyboardFrame.size;

//NSLog(@"keyboardFrame.origin.y = %f", keyboardFrame.origin.y);

//NSLog(@"keyboardFrame.size.height = %f", keyboardFrame.size.height);

BOOL hardwareKeyboardPresent = FALSE;;

if ((keyboardFrame.origin.y + keyboardFrame.size.height) > (self.view.frame.size.height+self.navigationController.navigationBar.frame.size.height)) {

    hardwareKeyboardPresent = TRUE;

}

//NSLog(@"bottomOfKeyboard = %f", bottomOfKeyboard);

//NSLog(@"self.view.frame.size.height = %f", self.view.frame.size.height);


查看完整回答
反对 回复 2019-08-19

添加回答

回复

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信