呈现子视图控制器时,UINavigationController不会旋转

时间:2015-12-01 23:21:27

标签: ios swift uinavigationcontroller

这是我的sample project

我在UINavigationController中嵌入了两个视图控制器。在第一个上,只有一个按钮在第二个视图控制器上执行segue。在后者上,按钮将其关闭回第一个视图控制器。

第一视图控制器不允许旋转并保持在Portrait,而第二视图控制器允许在Landscape中旋转。

为此,我在第一个视图控制器中添加了此代码:

override func supportedInterfaceOrientations() -> UIInterfaceOrientationMask {
    return UIInterfaceOrientationMask.Portrait
}

并添加了UINavigationController的扩展程序:

extension UINavigationController {

    override public func shouldAutorotate() -> Bool {
        if let topViewController = topViewController {
            return topViewController.shouldAutorotate()
        }

        return false
    }

    override public func supportedInterfaceOrientations() -> UIInterfaceOrientationMask {
        if let topViewController = self.topViewController {
            return topViewController.supportedInterfaceOrientations()
        }

        return .Portrait
    }
}

在第二个视图控制器上,我以编程方式添加了一些带有一些自动布局约束的标签。标签的标题显示UIDevice.currentDevice().orientation

我的问题如下:

当我在第一个视图控制器上放置设备时,它很好,布局是为Portrait奠定的,但是当我按下按钮以显示第二个视图时控制器,这个保持在Portrait而不是切换到Landscape

对我来说更大的问题就像在我的实际项目中一样,我根据设备方向设置了一些约束,UIDevice.currentDevice().orientation返回Landscape位置。

出了什么问题?这是正常的行为吗?我该如何解决?

2 个答案:

答案 0 :(得分:1)

在您的示例项目中,您不会在旋转设备时更新标签。您应override func viewWillTransitionToSize(size: CGSize, withTransitionCoordinator coordinator: UIViewControllerTransitionCoordinator)此外,Apple建议您不要使用UIDevice方向,而只需查看视图控制器视图的范围。例如:

override func viewWillTransitionToSize(size: CGSize, withTransitionCoordinator coordinator: UIViewControllerTransitionCoordinator) {
        if size.height<size.width {
            label.text = "Landscape"
        } else {
            label.text = "Portrait"
        }
    }

答案 1 :(得分:1)

在第二个视图控制器的UIViewController.attemptRotationToDeviceOrientation()中调用viewWillAppear就可以了。

相关问题