当我推动具有不同支持方向的控制器时,为什么 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 旋转到所有四个方向。
但是这个场景不能正常工作:
- 将 phone 横向放置,屏幕上显示主控制器。
- 控制器在纵向(符合预期)。
- 将 PhotoController 压入堆栈。
我希望 PhotoController 根据设备方向以横向打开,但它保持纵向。如果我手动来回旋转 phone,控制器会随着 phone 旋转。显然,用户永远不必这样做,来回旋转 phone 让控制器旋转。
当我点击 MainController 中推动 PhotoController 的按钮时,不会调用 navigationControllerSupportedInterfaceOrientations()。
我还尝试了什么:
- 在 PhotoController 中将 shouldAutorotate 覆盖为 return true。
- ...并在 MainController 中。
- 覆盖 UINavigationController 中的 supportedInterfaceOrientations 而不是使用委托。
- 正在检查 UINavigationController.visibleViewController 而不是 .topViewController。这没有用,因为 topviewController 结果是一个 iOS 私有 class UISnapshotModalViewController,而不是我的 class,所以调用 supportedInterfaceOrientation() 大概不会 return正确的值。
None 这些作品。
解决办法原来是调用UIViewController。 viewWillAppear() 或 viewDidAppear() 中的 attemptRotationToDeviceOrientation()。
在前一种情况下,推动控制器的动画与设备旋转动画同时出现,看起来很奇怪。在后一种情况下,旋转发生在控制器转换动画完成之后。这看起来也很奇怪,尽管方式不同。
我的代码是如何设置的:
我使用导航控制器,并使用控制方向的委托:
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 旋转到所有四个方向。
但是这个场景不能正常工作:
- 将 phone 横向放置,屏幕上显示主控制器。
- 控制器在纵向(符合预期)。
- 将 PhotoController 压入堆栈。
我希望 PhotoController 根据设备方向以横向打开,但它保持纵向。如果我手动来回旋转 phone,控制器会随着 phone 旋转。显然,用户永远不必这样做,来回旋转 phone 让控制器旋转。
当我点击 MainController 中推动 PhotoController 的按钮时,不会调用 navigationControllerSupportedInterfaceOrientations()。
我还尝试了什么:
- 在 PhotoController 中将 shouldAutorotate 覆盖为 return true。
- ...并在 MainController 中。
- 覆盖 UINavigationController 中的 supportedInterfaceOrientations 而不是使用委托。
- 正在检查 UINavigationController.visibleViewController 而不是 .topViewController。这没有用,因为 topviewController 结果是一个 iOS 私有 class UISnapshotModalViewController,而不是我的 class,所以调用 supportedInterfaceOrientation() 大概不会 return正确的值。
None 这些作品。
解决办法原来是调用UIViewController。 viewWillAppear() 或 viewDidAppear() 中的 attemptRotationToDeviceOrientation()。
在前一种情况下,推动控制器的动画与设备旋转动画同时出现,看起来很奇怪。在后一种情况下,旋转发生在控制器转换动画完成之后。这看起来也很奇怪,尽管方式不同。