我有一个splitView应用程序,它有一个rootViewController和DetailsViewController 当应用程序加载detailsViewController弹出一个包含UINavigationBar的Modal viewController。
UINavigationBar上有一个搜索栏(以编程方式设置)。当焦点进入搜索栏时,键盘会弹出。
但是,根据设备(模拟器)的方向,键盘会以错误的方向弹出。键盘始终显示为ipad处于“正常”方向(即主键所在的一侧)
我在所有的shouldAutoRotate方法中返回 YES :
- (BOOL)shouldAutorotateToInterfaceOrientation:
(UIInterfaceOrientation)interfaceOrientation;
为了尝试找出发生了什么,我每次向每个类添加一些调试代码,以便在每次触发shouldAutorotate事件时记录interfaceOrientation
,同时还显示模式viewDidLoad
方法何时触发。我对每个方向进行了测试:调试输出如下所示。
调试显示,无论实际的设备方向如何,rootViewController和DetailsViewController接口方向始终为Portrait 。
唯一正确的日志(其中接口方向=设备方向)是每次测试中模拟shouldAutorotate事件的第一个和最后一个(第三个)时间。
如果我在应用程序启动后旋转iPad,则键盘将以正确的方向显示。
任何人都可以阐明为什么会发生这种情况以及如何避免它?
[PORTRAIT]
主页按钮位置:底部
键盘出现:底部DEBUG:
APP DELEGATE- ADD SPLITVIEWCONTROLLER
细节 - 界面肖像
ROOT-Interface Portrait
ROOT-Interface Portrait
细节 - 界面肖像
MODAL-界面肖像
模态负载
MODAL-ROTATE START
MODAL-ROTATE结束
MODAL-Interface Portrait[风景]
主页按钮位置:左侧 键盘出现:左
DEBUG:
APP DELEGATE- ADD SPLITVIEWCONTROLLER
细节 - 界面肖像
ROOT-Interface Portrait
ROOT-Interface Portrait
细节 - 界面肖像
MODAL-Interface LANDSCAPE
模态负载
MODAL-ROTATE START
MODAL-ROTATE结束
MODAL-界面肖像
MODAL-Interface LANDSCAPE[PORTRAIT]
主页按钮位置:顶部
键盘出现:顶部DEBUG:
APP DELEGATE- ADD SPLITVIEWCONTROLLER
细节 - 界面肖像
ROOT-Interface Portrait
ROOT-Interface Portrait
细节 - 界面肖像
MODAL-界面肖像
模态负载
MODAL-ROTATE START
MODAL-ROTATE结束
MODAL-界面肖像
MODAL-Interface Portrait[风景]
主页按钮位置:右侧 键盘出现:右键
DEBUG:
APP DELEGATE- ADD SPLITVIEWCONTROLLER
细节 - 界面肖像
ROOT-Interface Portrait
ROOT-Interface Portrait
细节 - 界面肖像
MODAL-Interface LANDSCAPE
模态负载
MODAL-ROTATE START
MODAL-ROTATE结束
MODAL-界面肖像
MODAL-Interface LANDSCAPE
答案 0 :(得分:4)
在呈现模态视图控制器之前,您需要让iOS处理旋转事件。
以下是发生的事情:
这基本上是UIKit的竞争条件。其中一些细节是推测,但效果显而易见。
幸运的是,非常容易来修复。
不要直接创建新视图,而是将其安排在主队列上进行处理。它将在调度当前事件后完成,包括旋转事件。
电流:
[self presentModalViewController:newViewController animated:YES];
修正:
dispatch_async(dispatch_get_main_queue(), ^{
[self presentModalViewController:newViewController animated:YES];
});
使用这个新代码,您将获得此序列:
答案 1 :(得分:0)