Objective c iPad键盘出现在错误的方向

Objective c iPad键盘出现在错误的方向,objective-c,cocoa-touch,xcode,ipad,Objective C,Cocoa Touch,Xcode,Ipad,我有一个splitView应用程序,它有一个rootViewController和DetailsViewController 当应用程序加载detailsViewController时,会弹出一个包含UINavigationBar的模态viewController UINavigationBar上有一个搜索栏(通过编程设置)。当焦点移到搜索栏时,键盘弹出 但是,根据设备(模拟器)的方向,键盘会以错误的方向弹出。键盘始终显示为ipad处于“正常”方向(即主控键所在的一侧) 我在所有shouldAu

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

UINavigationBar上有一个搜索栏(通过编程设置)。当焦点移到搜索栏时,键盘弹出

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

我在所有shouldAutoRotate方法中返回YES

  - (BOOL)shouldAutorotateToInterfaceOrientation:
(UIInterfaceOrientation)interfaceOrientation;
为了尝试找出发生了什么,我在每个类中添加了一些调试代码,以记录每次触发shouldAutorotate事件时的
interfaceOrientation
,同时显示触发模式
viewdiload
方法的时间。我对每个方向都做了测试:调试输出如下所示

调试显示,无论实际设备方向如何,rootViewController和DetailsViewController接口方向始终是纵向的

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

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

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

[肖像]

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

调试:

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

[景观]

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

调试:

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

[肖像]

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

调试:

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

[景观]

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

调试:

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


您是否已将支持的方向添加到plist中

见:


在显示模态视图控制器之前,需要让iOS处理旋转事件

下面是正在发生的事情:

  • 该应用程序已启动
  • 根据设备的方向,屏幕旋转事件将排队等待现有视图控制器
  • 在屏幕旋转显示之前,将使用视图控制器中的现有方向创建新的视图控制器
  • 处理屏幕旋转事件
  • 新的视图控制器以错误的方向设置动画
  • 这基本上是一个UIKit比赛条件。其中一些细节只是猜测,但效果是显而易见的

    幸运的是,这非常容易修复

    与其直接创建新视图,不如将其安排在主队列上处理。它将在调度当前事件(包括旋转事件)后完成

    当前:

    [self presentModalViewController:newViewController animated:YES];
    
    固定的:

    dispatch_async(dispatch_get_main_queue(), ^{
        [self presentModalViewController:newViewController animated:YES];
    });
    
    使用此新代码,您将获得以下序列:

  • 该应用程序已启动
  • 根据设备的方向,屏幕旋转事件将排队等待现有视图控制器
  • 在屏幕旋转显示之前,创建新视图控制器的代码已排队,但未执行
  • 处理屏幕旋转事件
  • 新的视图控制器是使用视图控制器的正确方向创建的
  • 新的视图控制器将以正确的方向设置动画