方向更改后,iOS ViewController无法正确布局

我正在编写一个iOS应用程序,其中包含一些固定(纵向)视图和一些与方向相关的视图(纵向,左视图和右视图).

视图包含在基于以下代码的自定义导航控制器中:

class CustomNavigationViewController: UINavigationController {
    override func supportedInterfaceOrientations() -> Int {
        return self.topViewController.supportedInterfaceOrientations()
    }

    override func shouldAutorotate() -> Bool {
        return self.topViewController.shouldAutorotate()
    }
}

我正在nav子控制器中实现supportedInterfaceOrientations()和shouldAutorotate().

这是一个测试控制器

class TestViewController: UIViewController {
    var shouldRotate: Bool = false

    override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: NSBundle?) {
        super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil)
        self.shouldRotate = true
    }

    required init(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
    }

    convenience init(rotation shouldRotate: Bool) {
        self.init(nibName: "TestViewController", bundle: nil)
        self.shouldRotate = shouldRotate
    }

    override func supportedInterfaceOrientations() -> Int {
        if shouldRotate == false {
            return UIInterfaceOrientation.Portrait.rawValue
        } else {
            return super.supportedInterfaceOrientations()
        }
    }

    override func shouldAutorotate() -> Bool {
        return shouldRotate
    }

    override func didRotateFromInterfaceOrientation(fromInterfaceOrientation: UIInterfaceOrientation) {
        println("from: \(fromInterfaceOrientation.rawValue)")
    }

    @IBAction func buttonTapped(sender: AnyObject) {
        let newvc = TestViewController(rotation: true)
        self.navigationController?.pushViewController(newvc, animated: true)
    }
}

第一个控制器在AppDelegate中实例化,其旋转:false.其他控制器使用rotation创建:true并在点击按钮后按下.

以下是该视图的屏幕截图:

《方向更改后,iOS ViewController无法正确布局》

如果我在第一个(可旋转的)之后改变控制器上的方向,我得到以下结果:

《方向更改后,iOS ViewController无法正确布局》

控制器xib使用自动布局,如果我在点击按钮之前旋转设备,它会按预期工作,视图将填满整个屏幕.

此外,如果我在手机处于横向状态时轻按后退按钮,则第一个视图将锁定在此状态:

《方向更改后,iOS ViewController无法正确布局》

我正在将应用程序部署到iOS 8.

如何在旋转后仅制作第一个视图肖像并正确布置其他视图?

最佳答案 它可能无关紧要,因为它只打印出一个调试消息,但不要忘记在iOS 8中使用viewWillTransitionToSize(_:withTransitionCoordinator :)折旧didRotateFromInterfaceOrientation(_ :),并将其视为视图大小更改的责任(包括轮换).

我认为你是在正确的轨道上,但不是覆盖bothAutorotate()和supportedInterfaceOrientations()只覆盖supportedInterfaceOrientations().

我只是做了一个快速的POC,看看它是否有用.我在创建视图控制器(并使用Swift 2)时没有设置标志,但是你明白了:

class RotatingViewController: UIViewController {
    override func supportedInterfaceOrientations() -> UIInterfaceOrientationMask {
        return UIInterfaceOrientationMask.All
    }
}

class FixedViewController: UIViewController {
    override func supportedInterfaceOrientations() -> UIInterfaceOrientationMask {
        return UIInterfaceOrientationMask.Portrait
    }
}

class NavigationController: UINavigationController {
    override func supportedInterfaceOrientations() -> UIInterfaceOrientationMask {
        return self.topViewController?.supportedInterfaceOrientations() ?? UIInterfaceOrientationMask.All
    }
}

我认为您的演示中发生的事情是,当您转换到已修复的视图控制器时,您要求它进入纵向(即它)但不允许屏幕旋转回纵向模式.

所以..只是尝试删除CustomNavigationViewController中的’shouldAutorotate()’,看看是否有效.

点赞