uiviewcontroller - 当我插入具有不同支持方向的 Controller 时,为什么 UINavigationController 不改变方向?

标签 uiviewcontroller uinavigationcontroller orientation uiinterfaceorientation

我的代码是如何设置的:

我使用导航 Controller ,以及控制方向的委托(delegate):

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

  ...
}

我的应用程序的主视图 Controller 名为 MainController,并且仅纵向:

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

  ...
}

我有另一个 Controller PhotoController,它支持所有四个方向:

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

  ...
}

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

问题:

每个 Controller 本身都能正确处理方向 - 当我将手机旋转到所有四个方向时,MainController 保持纵向,而 PhotoController 则旋转到所有四个方向。

但是这种情况无法正常工作:

  1. 将手机横向放置,主 Controller 位于屏幕上。
  2. Controller 为肖像(如预期)。
  3. 将 PhotoController 压入堆栈。

我希望 PhotoController 根据设备方向以横向打开,但它仍保持纵向。如果我手动来回旋转手机, Controller 会随着手机一起旋转。显然,用户永远不必这样做,来回旋转手机以使 Controller 旋转。

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

我还尝试过什么:

  • 重写 shouldAutorotate 以在 PhotoController 中返回 true。
  • ...以及 MainController 中。
  • 重写 UINavigationController 中的supportedInterfaceOrientations,而不是使用委托(delegate)。
  • 检查 UINavigationController.visibleViewController 而不是 .topViewController。这不起作用,因为 topviewController 原来是一个 iOS 私有(private)类 UISnapshotModalViewController,而不是我的类,因此在其上调用supportedInterfaceOrientation() 可能不会返回正确的值。

这些都不起作用。

最佳答案

解决方案是调用 UIViewController。 viewWillAppear() 或 viewDidAppear() 中的 attemptsRotationToDeviceOrientation()。

在前一种情况下,插入 Controller 的动画与设备旋转动画同时发生,这看起来很奇怪。在后一种情况下,旋转发生在 Controller 转换动画完成后。这看起来也很奇怪,尽管方式不同。

关于uiviewcontroller - 当我插入具有不同支持方向的 Controller 时,为什么 UINavigationController 不改变方向?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42644138/

相关文章:

ios - 是否可以在 Swift 中为协议(protocol)实例设置观察者(KVO)

ios - 在 iOS 6 中以编程方式调用 willAnimateRotationToInterfaceOrientation

ios - 以编程方式嵌入 UIViewController?

ios - 容器内的导航 Controller

ios - 如何创建从 View Controller 到自身的 Storyboard转场?

ios - UIPopoverController + UINavigationController = 委托(delegate)问题

ios - UIVisualEffectView 在方向更改时错误地更改边界

android - 如何在Windows中的android模拟器中将纵向更改为横向

iOS:如何将 ViewController 推送到当前上下文?

ios - View 层次结构错误 - 试图在新 Storyboard中打开新 View Controller