ken*_*ytm 36
间接和SDK安全的方法是使文本字段成为第一响应者.如果存在外部键盘,则UIKeyboardWillShowNotification不应发布本地通知.
更新:自iOS 9以来不再适用,但您可以使用键盘尺寸来确定是否涉及硬件或软件键盘.请参阅如何可靠地检测iOS 9上是否连接了外部键盘?详情.
您可以收听"GSEventHardwareKeyboardAttached"(kGSEventHardwareKeyboardAvailabilityChangedNotification)Darwin通知,但这是一个私有API,因此如果您使用此应用程序,您的应用程序可能会被拒绝.要检查外部硬件是否存在,请使用私有GSEventIsHardwareKeyboardAttached()功能.
UIKit会监听并相应地设置UIKeyboardImpl.isInHardwareKeyboardMode属性,但这又是私有API.
use*_*239 28
还有另一个层面.
幸运的是,事件中有足够的信息来确定是否会出现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位置不同.
但是,我们确实有足够的信息来确定发生了什么:
在@ user721239的基础上,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);
| 归档时间: | 
 | 
| 查看次数: | 28683 次 | 
| 最近记录: |