加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

objective-c – iPad键盘出现方向错误

发布时间:2020-12-14 17:36:19 所属栏目:百科 来源:网络整理
导读:我有一个splitView应用程序,它有一个rootViewController和DetailsViewController 当应用程序加载detailsViewController弹出一个包含UINavigationBar的Modal viewController. UINavigationBar上有一个搜索栏(以编程方式设置).当焦点进入搜索栏时,键盘会弹出.
我有一个splitView应用程序,它有一个rootViewController和DetailsViewController
当应用程序加载detailsViewController弹出一个包含UINavigationBar的Modal viewController.

UINavigationBar上有一个搜索栏(以编程方式设置).当焦点进入搜索栏时,键盘会弹出.

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

我在所有的shouldAutoRotate方法中返回YES:

- (BOOL)shouldAutorotateToInterfaceOrientation:
(UIInterfaceOrientation)interfaceOrientation;

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

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

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

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

任何人都可以阐明为什么会发生这种情况以及如何避免它?

[PORTRAIT]

Home Button Position: bottom
Keyboard Appears: bottom

DEBUG:

APP DELEGATE- ADD SPLITVIEWCONTROLLER
DETAIL-Interface Portrait
ROOT-Interface Portrait
ROOT-Interface Portrait
DETAIL-Interface Portrait
MODAL-Interface Portrait
MODAL DID LOAD
MODAL-ROTATE START
MODAL-ROTATE END
MODAL-Interface Portrait

[LANDSCAPE]

Home Button Position: left
Keyboard Appears: left

DEBUG:

APP DELEGATE- ADD SPLITVIEWCONTROLLER
DETAIL-Interface Portrait
ROOT-Interface Portrait
ROOT-Interface Portrait
DETAIL-Interface Portrait
MODAL-Interface LANDSCAPE
MODAL DID LOAD
MODAL-ROTATE START
MODAL-ROTATE END
MODAL-Interface Portrait
MODAL-Interface LANDSCAPE

[PORTRAIT]

Home Button Position: top
Keyboard Appears: top

DEBUG:

APP DELEGATE- ADD SPLITVIEWCONTROLLER
DETAIL-Interface Portrait
ROOT-Interface Portrait
ROOT-Interface Portrait
DETAIL-Interface Portrait
MODAL-Interface Portrait
MODAL DID LOAD
MODAL-ROTATE START
MODAL-ROTATE END
MODAL-Interface Portrait
MODAL-Interface Portrait

[LANDSCAPE]

Home Button Position: right
Keyboard Appears: right

DEBUG:

APP DELEGATE- ADD SPLITVIEWCONTROLLER
DETAIL-Interface Portrait
ROOT-Interface Portrait
ROOT-Interface Portrait
DETAIL-Interface Portrait
MODAL-Interface LANDSCAPE
MODAL DID LOAD
MODAL-ROTATE START
MODAL-ROTATE END
MODAL-Interface Portrait
MODAL-Interface LANDSCAPE

解决方法

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

这是发生了什么:

>该应用程序已启动.
>根据设备的方向,屏幕旋转事件排队等待现有视图控制器.
>在出现屏幕旋转之前,将使用视图控制器中的现有方向创建新的视图控制器.
>处理屏幕旋转事件.
>您的新视图控制器以错误的方向动画存在.

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

幸运的是,这很容易解决.

而不是直接创建新视图,而是将其安排在主队列上进行处理.它将在调度当前事件后完成,其中包括旋转事件.

当前:

[self presentModalViewController:newViewController animated:YES];

固定:

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

使用这个新代码,您可以获得以下序列:

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读