模态视图的 Ipad 方向问题

Posted

技术标签:

【中文标题】模态视图的 Ipad 方向问题【英文标题】:Ipad orientation problem with modal view 【发布时间】:2010-10-01 18:15:14 【问题描述】:

我遇到了模态视图旋转的问题。 我在纵向模式下创建一个主视图,然后创建一个模态视图。一切正常:我可以旋转模态视图并且支持所有方向。 如果我以纵向模式创建主视图然后以横向旋转,然后我创建我的模式视图...模式处于纵向模式,而不是应有的横向模式。

主视图和模态视图中的 shouldAutorotateToInterfaceOrientation 均返回 YES。

有什么想法吗?

【问题讨论】:

你能发布一些示例代码吗?你是如何创建和展示你的模态视图控制器的? 【参考方案1】:

如果在 ios 将旋转事件排队之后,但在处理旋转事件之前呈现视图控制器,则可能会发生这种情况。从观察来看,我认为旋转事件特定于当前呈现的视图控制器。

这是一种有用的思考方式:

    iOS 将旋转事件排队等待顶视图控制器 A。 您的代码提供了一个视图控制器 B。 rotate 事件已出队,但它只针对视图控制器 A。

谢天谢地,有一个非常简单的解决方法。只需假设事件队列中有一个旋转事件,并确保您的视图实际上是在之后呈现的。您可以通过对新视图控制器的呈现进行排队,而不是直接呈现它来做到这一点。排队到主队列的块将在之后任何已排队的事件(如旋转事件)但用户有机会与您的 UI 交互之前执行。

变化:

[self performSegueWithIdentifier: @"firstRun" sender: self];

收件人:

dispatch_async(dispatch_get_main_queue(), ^
    [self performSegueWithIdentifier: @"firstRun" sender: self];
);

执行此操作后,您会得到以下行为:

    iOS 将旋转事件排队等待顶视图控制器 A。 您的代码安排将呈现新视图控制器的块。 rotate 事件已出队,但它只针对视图控制器 A。 新的视图控制器 B 由您的块呈现。它获得了新的方向。

【讨论】:

【参考方案2】:

我遇到了同样的问题。我终于通过从我的主视图控制器(而不是从其中一个子视图的视图控制器)显示模态视图来解决它。

【讨论】:

没有太多代码可以分享,都是关于你调用 PresentModalViewController 的视图控制器。【参考方案3】:

遇到了同样的问题,最终修复了将模态延迟一秒钟,因此“父”视图控制器可以获得正确的方向。

[self performSelector:@selector(presentLogin) withObject:nil afterDelay:1.0]

presentLogin 看起来像:

- (void) presentLogin 
LoginVC *loginVC = [[LoginVC alloc] init];
UINavigationController *nav = [[UINavigationController alloc] initWithRootViewController:loginViewController];
nav.modalPresentationStyle =UIModalPresentationFormSheet;
[self presentViewController:nav animated:YES completion:NULL]; 

【讨论】:

以上是关于模态视图的 Ipad 方向问题的主要内容,如果未能解决你的问题,请参考以下文章

当模态视图可见且 iPad 旋转时,UIPopover 的内容会更改为随机方向

呈现视图控制器中的方向更改未更新父视图控制器

iPad 模态视图控制器以纵向动作,即使它是横向的

如何通知父视图控制器模态视图控制器中更改的屏幕方向?

当被模态视图控制器覆盖时,iOS 6 视图控制器布局在方向更改后不会更新

模态视图的 iPad 问题:创建视图控制器后模态视图标签为空