【问题标题】:iPad keyboard appears in wrong orientationiPad 键盘出现方向错误
【发布时间】:2011-03-13 23:23:23
【问题描述】:

我有一个 splitView 应用程序,它有一个 rootViewController 和 DetailsViewController 当应用程序加载 detailsViewController 时,会弹出一个包含 UINavigationBar 的 Modal viewController。

UINavigationBar 上有一个搜索栏(以编程方式设置)。当焦点被带到搜索栏时,键盘会弹出。

但是,根据设备(模拟器)的方向,键盘会以错误的方向弹出。键盘总是显示为好像 ipad 处于“正常”方向(即在 home 键所在的一侧)

我在所有 shouldAutoRotate 方法中都返回 YES

  - (BOOL)shouldAutorotateToInterfaceOrientation:
(UIInterfaceOrientation)interfaceOrientation;

为了尝试找出发生了什么,我向每个类添加了一些调试代码,以在每次触发 shouldAutorotate 事件时记录interfaceOrientation,同时还显示模式viewDidLoad 方法何时触发。我对每个方向都做了测试:调试输出如下所示。

调试显示,无论实际设备方向如何,rootViewController 和 DetailsViewController 界面方向始终为 Portrait

唯一正确的日志(其中界面方向 = 设备方向)是在每个测试中触发模式 shouldAutorotate 事件的第一次和最后一次(第三次)。

如果我在应用启动后旋转 iPad,那么键盘会以正确的方向显示。

谁能解释为什么会发生这种情况以及如何避免它?

[肖像]

主页按钮位置:底部
键盘出现:底部

调试:

APP DELEGATE - 添加 SPLITVIEWCONTROLLER
DETAIL-界面头像
ROOT接口纵向
ROOT接口纵向
DETAIL-界面头像
MODAL-界面纵向
模态加载
模态旋转启动
模态旋转端
MODAL-Interface Portrait

[风景]

主页按钮位置:左
键盘出现:左

调试:

APP DELEGATE - 添加 SPLITVIEWCONTROLLER
DETAIL-界面头像
ROOT接口纵向
ROOT接口纵向
DETAIL-界面头像
MODAL-界面景观
模态加载
模态旋转启动
模态旋转端
MODAL-界面纵向
MODAL-Interface LANDSCAPE

[肖像]

主页按钮位置:顶部
键盘出现:top

调试:

APP DELEGATE - 添加 SPLITVIEWCONTROLLER
DETAIL-界面头像
ROOT接口纵向
ROOT接口纵向
DETAIL-界面头像
MODAL-界面纵向
模态加载
模态旋转启动
模态旋转端
MODAL-界面纵向
MODAL-Interface Portrait

[风景]

主页按钮位置:右
键盘出现:右

调试:

APP DELEGATE - 添加 SPLITVIEWCONTROLLER
DETAIL-界面头像
ROOT接口纵向
ROOT接口纵向
DETAIL-界面头像
MODAL-界面景观
模态加载
模态旋转启动
模态旋转端
MODAL-界面纵向
MODAL-界面景观

【问题讨论】:

    标签: objective-c cocoa-touch xcode ipad


    【解决方案1】:

    在呈现模态视图控制器之前,您需要让 iOS 处理旋转事件。

    这是发生了什么:

    1. 应用程序已启动。
    2. 根据设备的方向,屏幕旋转事件为现有视图控制器排队。
    3. 在屏幕旋转出现之前,您的新视图控制器会以视图控制器的现有方向创建。
    4. 已处理屏幕旋转事件。
    5. 您的新视图控制器以错误的方向设置动画。

    这基本上是一个 UIKit 竞争条件。其中一些细节是推测,但效果是显而易见的。

    幸运的是,这真的很容易修复。

    与其直接创建新视图,不如安排它在主队列上处理。它会在当前事件被派发后完成,包括旋转事件。

    当前:

    [self presentModalViewController:newViewController animated:YES];
    

    固定:

    dispatch_async(dispatch_get_main_queue(), ^{
        [self presentModalViewController:newViewController animated:YES];
    });
    

    使用此新代码,您将获得以下序列:

    1. 应用程序已启动。
    2. 根据设备的方向,屏幕旋转事件为现有视图控制器排队。
    3. 在屏幕旋转出现之前,创建新视图控制器的代码已排队但未执行。
    4. 已处理屏幕旋转事件。
    5. 您的新视图控制器是使用视图控制器的正确方向创建的。
    6. 您的新视图控制器以正确的方向动画生成。

    【讨论】:

      【解决方案2】:
      猜你喜欢
      • 1970-01-01
      • 2012-07-21
      • 2017-04-02
      • 1970-01-01
      • 2015-03-29
      • 1970-01-01
      • 2021-01-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多