代码之家  ›  专栏  ›  技术社区  ›  Luke Mcneice

iPad键盘出现方向错误

  •  4
  • Luke Mcneice  · 技术社区  · 15 年前

    我有一个splitview应用程序,它有rootviewcontroller和detailsviewcontroller 当应用程序加载detailsViewController时,会弹出一个包含uinavigationbar的模式视图控制器。

    uinavigationbar上有一个搜索栏(按程序设置)。当焦点移到搜索栏时,键盘弹出。

    但是,根据设备(模拟器)的方向,键盘会以错误的方向弹出。键盘始终显示为iPad处于“正常”方向(即主按键所在的一侧)。

    我回来了 在所有的shouldautorotate方法中:

      - (BOOL)shouldAutorotateToInterfaceOrientation:
    (UIInterfaceOrientation)interfaceOrientation;
    

    为了尝试找出发生了什么,我在每个类中添加了一些调试代码来记录 interfaceOrientation 每次激发ShouldAutoRotate事件时,同时显示模式 viewDidLoad 方法烧成。我为每个方向做了一个测试:调试输出如下所示。

    调试表明,无论实际设备方向如何,rootviewcontroller和detailsviewcontroller接口方向始终是纵向的。 .

    唯一正确的日志(其中接口方向=设备方向)是在每个测试中第一次和最后一次(第三次)触发模态应向上触发事件。

    如果我在应用程序启动后旋转iPad,键盘就会出现在正确的方向上。

    有人能解释一下为什么会发生这种情况以及如何避免这种情况吗?

    [肖像]

    主按钮位置:底部
    键盘显示:底部

    调试:

    应用程序委托-添加SplitViewController
    细节界面纵向
    根接口纵向
    根接口纵向
    细节界面纵向
    模态界面图
    模态载荷
    模式旋转启动
    模态旋转端
    模态界面图

    [风景]

    主按钮位置:左
    键盘显示:左

    调试:

    应用程序委托-添加SplitViewController
    细节界面纵向
    根接口纵向
    根接口纵向
    细节界面纵向
    模态界面景观
    模态载荷
    模式旋转启动
    模态旋转端
    模态界面图
    模态界面景观

    [肖像]

    主按钮位置:顶部
    键盘显示:顶部

    调试:

    应用程序委托-添加SplitViewController
    细节界面纵向
    根接口纵向
    根接口纵向
    细节界面纵向
    模态界面图
    模态载荷
    模式旋转启动
    模态旋转端
    模态界面图
    模态界面图

    [风景]

    主按钮位置:右
    键盘显示:右

    调试:

    应用程序委托-添加SplitViewController
    细节界面纵向
    根接口纵向
    根接口纵向
    细节界面纵向
    模态界面景观
    模态载荷
    模式旋转启动
    模态旋转端
    模态界面图
    模态界面景观

    2 回复  |  直到 12 年前
        1
  •  4
  •   Steven Fisher    12 年前

    在展示模态视图控制器之前,您需要让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. 新的视图控制器将以正确的方向动画化。