3

我对 iOS SDK 比较陌生,我遇到了一个关于我正在开发的应用程序的设备键盘位置和方向的非常奇怪的问题。问题是如果键盘在用户多任务或应用程序进入后台时打开,用户返回应用程序后,键盘将移位(UIKeyboardWillChangeFrameNotification抬起),但方向和位置不正确.

有时键盘也会完全显示在屏幕之外,这是完全不受欢迎的行为。

我的问题是:

  1. 键盘的位置和方向取决于什么?它是如何被 iOS 控制的?

  2. 无论设备类型和屏幕尺寸如何,有没有办法检测键盘何时显示在屏幕外?我认为通过跟踪UIKeyboardWillChangeFrameNotificationUIKeyboardWillShowNotification.

  3. 在显示键盘之前如何重置/设置键盘的位置和方向?这甚至可能吗?

4

2 回答 2

5

从文档中:

使用“键盘通知用户信息键”中描述的键从 userInfo 字典中获取键盘的位置和大小。

用于从键盘通知的用户信息字典中获取值的键:

NSString * const UIKeyboardFrameBeginUserInfoKey;
NSString * const UIKeyboardFrameEndUserInfoKey;
NSString * const UIKeyboardAnimationDurationUserInfoKey;
NSString * const UIKeyboardAnimationCurveUserInfoKey;
于 2012-10-12T07:47:28.057 回答
1

1.) 键盘是一个 UIWindow,位置取决于应用程序的主窗口。

2.)您可以做的是,在通知UIKeyboardWillShowNotificationUIKeyboardWillChangeFrameNotification方法之一触发时,循环浏览窗口子视图以定位键盘。在我的一个应用程序中,我需要向键盘添加一个子视图。对于您的情况,您可以通过以下方式获取框架:

//The UIWindow that contains the keyboard view - It some situations it will be better to actually
//iterate through each window to figure out where the keyboard is, but In my applications case
//I know that the second window has the keyboard so I just reference it directly
UIWindow* tempWindow = [[[UIApplication sharedApplication] windows] objectAtIndex:1];

//Because we cant get access to the UIPeripheral throught the SDK we will just use UIView.
//UIPeripheral is a subclass of UIView anyways
UIView* keyboard;

    //Iterate though each view inside of the selected Window
for(int i = 0; i < [tempWindow.subviews count]; i++)
{
    //Get a reference of the current view
    keyboard = [tempWindow.subviews objectAtIndex:i];

           //Assuming this is for 4.0+, In 3.0 you would use "<UIKeyboard"
           if([[keyboard description] hasPrefix:@"<UIPeripheral"] == YES) {

                  //Keyboard is now a UIView reference to the UIPeripheral we want
                  NSLog(@"Keyboard Frame: %@",NSStringFromCGRect(keyboard.frame));

           }
}

3.)不完全确定这是可能的,但我给你提供的代码。keyboard现在被转换为“UIView”,您可以对其应用自己的转换。

这可能不是most优雅的解决方案,但它适用于我的情况。

希望这可以帮助 !

于 2012-06-09T02:09:19.127 回答