【问题标题】:Ipad orientation problem with modal view模态视图的 Ipad 方向问题
【发布时间】:2026-02-14 02:10:02
【问题描述】:

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

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

有什么想法吗?

【问题讨论】:

  • 你能发布一些示例代码吗?你是如何创建和展示你的模态视图控制器的?

标签: iphone ipad orientation


【解决方案1】:

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

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

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

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

变化:

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

收件人:

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

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

  1. iOS 将旋转事件排队等待顶视图控制器 A。
  2. 您的代码安排将呈现新视图控制器的块。
  3. rotate 事件已出队,但它只针对视图控制器 A。
  4. 新的视图控制器 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]; 
    }
    

    【讨论】: