UINavigationController堆栈中UIViewControllers的不同接口方向

时间:2016-08-04 10:36:30

标签: ios iphone swift uiviewcontroller uinavigationcontroller

我有一个带纵向方向的rootviewcontroller的导航控制器。然后我想将第二个viewcontroller推向具有横向方向的堆栈。可悲的是,我发现无法强迫应用程序重新检查supportedInterfaceOrientations。所以横向视图控制器显示在protrait中,直到用户将他的设备旋转到横向。

我准备了一个测试项目:https://github.com/buechner/InterfaceOrientationTest

甚至可以自动更改导航控制器堆栈中的方向吗?

2 个答案:

答案 0 :(得分:2)

您可以在ViewController内展示LandscapeViewController以强行制作landscape

viewDidLoad的{​​{1}}

中使用以下代码行
LandscapeViewController

self.performSelector(#selector(LandscapeViewController.launchLandscapeScreen), withObject: nil, afterDelay:1)

中添加以下方法
LandscapeViewController

答案 1 :(得分:0)

可以这样做,但你必须制作UIStoryboardSegue子类

  1. 创建UIStoryBoradSegue的子类并覆盖perform()

    override func perform() {
    let sourceVC = self.sourceViewController
    let destonationVC =  self.destinationViewController
    
    sourceVC.navigationController!.presentViewController(destonationVC, animated: true, completion: nil)
    }
    
  2. 在您的NavigationControllerSubclass中更改shouldAutoRotatesupportedInterfaceOrientations

    public override func shouldAutorotate() -> Bool {
    return (self.topViewController?.shouldAutorotate())!
    }
    
    
    public override func supportedInterfaceOrientations() -> UIInterfaceOrientationMask {
    return (self.topViewController?.supportedInterfaceOrientations())!
    }
    
  3. 从viewControllers连接Segue时选择你的segue子类

  4. 4.在每个班级中添加shouldAutorotatesupportedInterfaceOrientations个方法

        override func shouldAutorotate() -> Bool {
    
        return true
         }
    
        override func supportedInterfaceOrientations() -> UIInterfaceOrientationMask {
        return .Portrait // or landscape in case you want orientation to be landscape
        }
    
    1. 当我们制作自定义segue时,您还需要添加后退按钮。