我的代码是如何设置的:
我使用导航 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 则旋转到所有四个方向。
但是这种情况无法正常工作:
- 将手机横向放置,主 Controller 位于屏幕上。
- Controller 为肖像(如预期)。
- 将 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/