iOS 8屏幕旋转:键盘框架显示不正确

5
这只是iOS 8的问题,设备方向发生变化时,iOS 7中键盘显示正确。我的应用程序支持纵向和横向布局,并使用自动布局。
如果我将包含UITextField子类的UIViewController子类推入导航堆栈并且UITextField在纵向方向上成为第一响应者,则默认键盘会正确显示。但是,如果我将设备旋转到横向方向,则UIViewController子视图布局将正确显示,但是键盘将显示在屏幕顶部中心。键盘的方向对于横向方向是正确的,但它的框架宽度与纵向方向期望的相同。如果我将应用程序方向设置为仅限横向,则键盘不会正确显示。这仅适用于iOS 8的方向更改问题。

2
我认为这可能是iPhone 6的一个bug。 - MobileDev98
2个回答

4

iOS 8之前,键盘的位置、宽度和高度始终相对于竖屏方向并报告给应用程序(例如,在iPad上,横屏时键盘宽度在y方向上为约352个像素)。从iOS 8开始,这一点已经更新,使得(0,0)始终位于物理视图的左上角,宽度/高度反映了在iOS之外通常会预期的x/y方向。如果您先前通过类似keyboardDidShow[notification userInfo]来定位您的键盘,您将得到不太合理的数字。您可以使用以下代码来考虑iOS 8之前的特殊情况:

- (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的问题。

您只需要在Info.plist文件中添加Launch screen interface file base name键即可。

关于此问题的详细解释可以在这里找到。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接