当我推动具有不同支持方向的控制器时,为什么 UINavigationController 不改变方向?

Why doesn't UINavigationController change orientation when I push a controller with different supported orientations?

我的代码是如何设置的:

我使用导航控制器,并使用控制方向的委托:

class NavDelegate: UINavigationControllerDelegate {
  func navigationControllerSupportedInterfaceOrientations(_ navigationController: UINavigationController) -> UIInterfaceOrientationMask {
    print("Checking orientation")
    if topViewController != nil {
      return topViewController!.supportedInterfaceOrientations
    }
    return .portrait
  }

  ...
}

我的应用程序的主视图控制器名为 MainController,它是纵向的:

class MainController: UIViewController {
  override var supportedInterfaceOrientations: UIInterfaceOrientationMask {
    return .portrait
  }

  ...
}

我有另一个控制器 PhotoController,它支持所有四种方向:

class PhotoController: UIViewController {
  override var supportedInterfaceOrientations: UIInterfaceOrientationMask {
    return .all
  }

  ...
}

我使用 pushViewController() 将 PhotoController 推到 MainController 的顶部。

问题:

每个控制器本身都能正确处理方向 — 当我将 phone 旋转到所有四个方向时,MainController 保持纵向,而 PhotoController 旋转到所有四个方向。

但是这个场景不能正常工作:

  1. 将 phone 横向放置,屏幕上显示主控制器。
  2. 控制器在纵向(符合预期)。
  3. 将 PhotoController 压入堆栈。

我希望 PhotoController 根据设备方向以横向打开,但它保持纵向。如果我手动来回旋转 phone,控制器会随着 phone 旋转。显然,用户永远不必这样做,来回旋转 phone 让控制器旋转。

当我点击 MainController 中推动 PhotoController 的按钮时,不会调用 navigationControllerSupportedInterfaceOrientations()。

我还尝试了什么:

None 这些作品。

解决办法原来是调用UIViewController。 viewWillAppear() 或 viewDidAppear() 中的 attemptRotationToDeviceOrientation()。

在前一种情况下,推动控制器的动画与设备旋转动画同时出现,看起来很奇怪。在后一种情况下,旋转发生在控制器转换动画完成之后。这看起来也很奇怪,尽管方式不同。