Sar*_*lan 32 keyboard objective-c ios ios9
在iOS 9之前,确定是否连接外部键盘的最可靠方法是监听UIKeyboardWillShowNotification并将文本字段作为第一响应者,如本问题中所述.使用虚拟键盘时会触发通知,但使用外部键盘时不会触发.
但是,iOS 9现在已经改变了这种行为,UIKeyboardWillShowNotification当连接外部键盘时也会触发,因为现在显示了新的键盘工具栏.
仍然可以检测键盘高度并判断它是较小的工具栏还是正在显示的较大的虚拟键盘.然而,这种方法是不可靠的,因为键盘高度在各种beta之间已经改变,并且不能指望随着时间的推移保持不变.
有没有更可靠的方法可以用于iOS 9?
Sar*_*lan 50
回到最初的问题后,我找到了一个有效的解决方案.
似乎当显示常规虚拟键盘时,键盘框架在屏幕的尺寸内.但是,当连接物理键盘并显示键盘工具栏时,键盘框架位于屏幕外.我们可以检查键盘框架是否在屏幕外以确定是否显示键盘工具栏.
- (void) keyboardWillShow:(NSNotification *)notification {
NSDictionary* userInfo = [notification userInfo];
CGRect keyboardFrame = [[userInfo objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue];
CGRect keyboard = [self.view convertRect:keyboardFrame fromView:self.view.window];
CGFloat height = self.view.frame.size.height;
if ((keyboard.origin.y + keyboard.size.height) > height) {
self.hasKeyboard = YES;
}
}
Run Code Online (Sandbox Code Playgroud)
kam*_*ala 10
iOS版SDK 14终于带来了公共API: GCKeyboard。要检查是否连接了外接键盘:
let isKeyboardConnected = GCKeyboard.coalesced != nil
Run Code Online (Sandbox Code Playgroud)
笔记:
import GameControllerif #available(iOS 14.0, *)该代码支持iOS 8和iOS 9,inputAccessoryView,具有双重保护的常量,以准备在将来的iOS版本中进行新更改并支持新设备:
#define gThresholdForHardwareKeyboardToolbar 160.f // it's minimum height of the software keyboard on non-retina iPhone in landscape mode
- (bool)isHardwareKeyboardUsed:(NSNotification*)keyboardNotification {
NSDictionary* info = [keyboardNotification userInfo];
CGRect keyboardEndFrame;
[[info valueForKey:UIKeyboardFrameEndUserInfoKey] getValue:&keyboardEndFrame];
float height = [[UIScreen mainScreen] bounds].size.height - keyboardEndFrame.origin.y;
return height < gThresholdForHardwareKeyboardToolbar;
}
Run Code Online (Sandbox Code Playgroud)
请注意,可能存在但未使用硬件键盘。
| 归档时间: |
|
| 查看次数: |
9636 次 |
| 最近记录: |