iOS 8 方向更改:键盘框架无法正确显示

问题描述 投票:0回答:2

这只是 iOS 8 的问题,随着设备方向的改变,键盘在 iOS 7 中可以正确显示。我的应用程序支持纵向和横向,并使用自动布局。

如果我将包含 UITextField 子类的 UIViewController 子类推入导航堆栈,并且 UITextField 成为纵向的第一个响应者,则默认键盘将正确显示。但是,如果我将设备旋转到横向,则 UIViewController 子视图布局将正确显示,但键盘显示在屏幕的顶部中心。键盘的方向对于横向方向是正确的,但其框架宽度与纵向方向的预期宽度相同。 如果我将应用程序方向设置为仅横向,则键盘无法正确显示。 这只是 iOS 8 方向改变的问题。

ios swift objective-c autolayout ios8
2个回答
4
投票

在 iOS 8 之前,向应用程序报告时,键盘的位置和宽度/高度始终相对于纵向方向。 (例如,横向的键盘宽度位于 y 方向,在 iPad 上约为 352 像素。) 从 iOS 8 开始,此功能已更新为始终在(物理)视图的左上角显示 (0,0),并且宽度/高度反映了您在 iOS 之外通常期望的 x/y 方向。如果您之前通过类似

keyboardDidShow
[notification userInfo]
之类的方式定位键盘,您将得到不太有意义的数字。您可以使用以下方法来考虑 iOS8 之前的特性:

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

    NSDictionary *keyboardInfo = [notification userInfo];
    CGSize keyboardSize = [[keyboardInfo objectForKey:UIKeyboardFrameBeginUserInfoKey] CGRectValue].size;

    UIInterfaceOrientation orientation = [[UIApplication sharedApplication] statusBarOrientation];
    float height, width;
    if(UIInterfaceOrientationIsPortrait(orientation)){
        width = keyboardSize.width;
        height = keyboardSize.height;
    } else {
        if (floor(NSFoundationVersionNumber) <= NSFoundationVersionNumber_iOS_7_1){
            width = keyboardSize.height;
            height = keyboardSize.width;
        } else {
            width = keyboardSize.width;
            height = keyboardSize.height;
        }
    }

    // Remainder of function
}

可以重构为...

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

    NSDictionary *keyboardInfo = [notification userInfo];
    CGSize keyboardSize = [[keyboardInfo objectForKey:UIKeyboardFrameBeginUserInfoKey] CGRectValue].size;

    UIInterfaceOrientation orientation = [[UIApplication sharedApplication] statusBarOrientation];
    float width = keyboardSize.width;
    float height = keyboardSize.height;
    if(!UIInterfaceOrientationIsPortrait(orientation) && (floor(NSFoundationVersionNumber) <= NSFoundationVersionNumber_iOS_7_1)){
        width = keyboardSize.height;
        height = keyboardSize.width;
    }

    // Remainder of function
}

此外,8.1 更新还修复了几个可能与上述更改相关的横向/旋转错误。获取更新并查看是否可以解决您的问题。


3
投票

这不是iOS8或iPhone 6的bug。这是旧项目正确迁移到xCode6的问题。

您只需将

Launch screen interface file base name
键添加到
Info.plist
文件即可。

此案例的详细说明您可以找到这里

© www.soinside.com 2019 - 2024. All rights reserved.