这是我的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
位置。
出了什么问题?这是正常的行为吗?我该如何解决?
答案 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
就可以了。