objective-c - iOS 8 方向改变 : Keyboard frame does not display correctly

标签 objective-c xcode swift ios8 autolayout

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

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

最佳答案

在 iOS 8 之前,键盘的位置和宽度/高度在向应用报告时始终与纵向相关。 (例如,横向的键盘宽度在 y 方向,在 iPad 上约为 352 像素。) 从 iOS 8 开始,它已更新为始终在您的(物理) View 的左上角显示 (0,0),并且宽度/高度反射(reflect)了您在 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 更新还修复了几个可能与上述更改相关的横向/旋转错误。获取更新,看看是否能解决您的问题。

关于objective-c - iOS 8 方向改变 : Keyboard frame does not display correctly,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26268743/

相关文章:

iphone - 如何在 map View 中添加自定义标注 View

objective-c - 要在 objective-c 中 float 的字符串

iphone - 手势识别器 : shouldReceiveTouch: not getting called

xcode - 从 'String' 到 'String' 的条件向下转换总是成功 - Swift 错误

ios - 第二次运行时,Google map 在 iOS 中显示白屏?

ios - 无法将数据获取到 MasterViewController 中的 UITableView 中

iphone - 将图像文件上传到 Web 表单

ios - 而 dispatch_sync(kBgQueue, ^{});在后台使用前台 UI 瞬间卡住

ios - Collection View 单元格内的 MKMapview 不可见

swift - 我的 swift 应用程序上有很多注释。如何只在当前可见的 map 区域上显示注释?