我在我的iOS应用程序中支持所有方向和自动旋转,但我在这样的视图控制器中实现了 shouldAutorotate 方法:
shouldAutorotate
- (BOOL)shouldAutorotate { return NO; }
并且它肯定会阻止视图在加载或以纵向显示时旋转到横向 . 但是当加载视图控制器或看起来设备已经处于横向状态时,视图将以横向显示 .
无论设备的方向如何,我如何从头开始加载/使视图以纵向显示?
谢谢
您可以使用方法 supportedInterfaceOrientations() 来指定特定视图控制器的可用方向 .
supportedInterfaceOrientations()
但是,当您将视图控制器嵌入导航堆栈时,系统会在导航控制器上调用 shouldAutorotate 和 supportedInterfaceOrientations ,并忽略视图控制器返回的值 .
supportedInterfaceOrientations
我使用 UINavigationController 的子类来从顶视图控制器获取支持的方向 . 你也可以为 UITabBarViewController 创建这样一个类
UINavigationController
UITabBarViewController
class SingleOrientationNavigationController: UINavigationController { //MARK : Orientation override func shouldAutorotate() -> Bool { if let topVC = topViewController { return topVC.shouldAutorotate() } return false } override func supportedInterfaceOrientations() -> UIInterfaceOrientationMask { if let topVC = topViewController { return topVC.supportedInterfaceOrientations() } return UIInterfaceOrientationMask.Portrait } // MARK : Status bar override func preferredStatusBarStyle() -> UIStatusBarStyle { if let topVC = topViewController { return topVC.preferredStatusBarStyle() } return .Default } }
请注意,如果推送的视图控制器的旋转选项少于前一个,则可能会出现一些问题 .
让我们考虑两个视图控制器:
A : only portrait B : all orientation
如果从A到B执行推动,那么它就可以了,B可以根据需要旋转,即使B在流行时处于横向状态,你也会回到A纵向 .
但是如果在B处于横向状态时从B到A执行推送,则A也将显示为横向!一种解决方法是使用模态视图控制器,而不是在这种特殊情况下推送它 .
可以通过在应用程序的 .plist 中添加 Initial interface orientation = Portrait (bottom home button) 来完成 .
.plist
Initial interface orientation = Portrait (bottom home button)
2 回答
您可以使用方法
supportedInterfaceOrientations()
来指定特定视图控制器的可用方向 .但是,当您将视图控制器嵌入导航堆栈时,系统会在导航控制器上调用
shouldAutorotate
和supportedInterfaceOrientations
,并忽略视图控制器返回的值 .我使用
UINavigationController
的子类来从顶视图控制器获取支持的方向 . 你也可以为UITabBarViewController
创建这样一个类请注意,如果推送的视图控制器的旋转选项少于前一个,则可能会出现一些问题 .
让我们考虑两个视图控制器:
如果从A到B执行推动,那么它就可以了,B可以根据需要旋转,即使B在流行时处于横向状态,你也会回到A纵向 .
但是如果在B处于横向状态时从B到A执行推送,则A也将显示为横向!一种解决方法是使用模态视图控制器,而不是在这种特殊情况下推送它 .
可以通过在应用程序的
.plist
中添加Initial interface orientation = Portrait (bottom home button)
来完成 .