我有两个类,它们是UIViewController
的子类。 PortraitViewController
和LandscapeViewController
。
这些类的变量shouldAutorotate
,supportedInterfaceOrientations
和preferredInterfaceOrientationForPresentation
具有重写实现,因此可以相应地坚持纵向或横向。
我的应用程序接受纵向和横向模式。
现在,我还有:
ViewController1
是PortraitViewController
的子类ViewController2
是LandscapeViewController
的子类当我显示ViewController1
并附有UINavigationController
时,它会像预期的那样保持纵向。
当我显示ViewController2
并附有UINavigationController
时,作为ViewController1
上方的模态导航,它会像预期的那样保持风景。
UINavigationController
有一个扩展名,它也覆盖了上面提到的vars,但是它从visibleController
参数中读取属性。
但是当我解雇ViewController2
时,ViewController1
出现在横向。
无论我在顶部显示什么,如何使ViewController1
停留在纵向模式?
注:每次设备处于纵向模式时。
编辑:
这是一个演示项目:https://www.dropbox.com/s/ishe88e1x81nzlp/DemoOrientationApp.zip?dl=0
答案 0 :(得分:1)
visibleViewController是导航堆栈的顶部视图控制器,或者是导航控制器提供的视图控制器。
因此,当您显示第二个导航控制器时,第一个导航控制器将读取第二个导航控制器属性,该属性将传回景观视图控制器的属性。
您需要使用的是topViewController。这样,该设置将限于视图控制器堆栈。
答案 1 :(得分:0)
好的,所以:
丢弃UINavigationControllerExtension。
更改您的Info.plist,以便我们仅以纵向启动:
(删除项目1和2。)
在应用程序委托中,添加以下代码,以允许我们在启动后旋转到横向:
func application(_ application: UIApplication, supportedInterfaceOrientationsFor window: UIWindow?) -> UIInterfaceOrientationMask {
return .all
}
在ViewController中,修改代码如下:
class ViewController: PortraitViewController, UINavigationControllerDelegate {
override func viewDidLoad() {
super.viewDidLoad()
self.navigationController?.delegate = self
}
func navigationControllerSupportedInterfaceOrientations(_ navigationController: UINavigationController) -> UIInterfaceOrientationMask {
return self.supportedInterfaceOrientations
}
@IBAction func showView(_ sender: Any) {
let vc = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "ViewController2") as! ViewController2
let nav = UINavigationController(rootViewController: vc)
nav.delegate = vc
present(nav, animated: true, completion: nil)
}
}
在ViewController2中,修改代码如下:
class ViewController2: LandscapeViewController, UINavigationControllerDelegate {
func navigationControllerSupportedInterfaceOrientations(_ navigationController: UINavigationController) -> UIInterfaceOrientationMask {
return self.supportedInterfaceOrientations
}
func navigationControllerPreferredInterfaceOrientationForPresentation(_ navigationController: UINavigationController) -> UIInterfaceOrientation {
return self.preferredInterfaceOrientationForPresentation
}
@IBAction func dismiss(_ sender: Any) {
dismiss(animated: true, completion: nil)
}
}
该应用程序现在可以按预期运行。