我有一个应用程序,其中有几个VC嵌入在NavigationController中。
我需要所有的VC都以纵向方向锁定,纵向和横向只能锁定一个。
我尝试了不同的方法,这个方法对我有用:
extension UINavigationController {
public override func supportedInterfaceOrientations() -> Int {
return visibleViewController.supportedInterfaceOrientations()
}
public override func shouldAutorotate() -> Bool {
return visibleViewController.shouldAutorotate()
}
}
然后我像这样修改每个ViewController:
class ViewController: UIViewController {
override func supportedInterfaceOrientations() -> Int {
return Int(UIInterfaceOrientationMask.Portrait.rawValue)
}
}
当我打开应用程序并从一个VC转到另一个VC时,一切都很顺利。应该只有肖像的视图只是肖像。然后我打开未修改的视图,并按预期更改interfaceOrientation。
但是然后让我说我在Landscape中留下最后一个未修改的视图,然后在NavBar中按一个后退按钮并转到上一个控制器(它被修改为仅肖像)。 VC的布局显示为Landscape。
如果我继续按下后退按钮,所有其他VC的行为就像他们从未被告知只是肖像。
答案 0 :(得分:1)
我想我能够复制你描述的场景。不幸的是,我尝试强制更新的常规方法不起作用,但我确实找到了似乎有用的this SO answer。将它放在视图控制器中,然后返回到viewDidAppear
:
override func viewDidAppear(animated: Bool) {
super.viewDidAppear(animated)
let value = UIInterfaceOrientation.Portrait.rawValue
UIDevice.currentDevice().setValue(value, forKey: "orientation")
}
这个修复似乎对我有用。虽然这是一个非常艰难的过渡。我希望有帮助
答案 1 :(得分:0)
我遇到了视图控制器和方向锁差异的问题。我把它添加到"解锁"控制器:
- (void)viewWillDisappear:(BOOL)animated
{
[super viewWillDisappear:animated];
[self willRotateToInterfaceOrientation:UIInterfaceOrientationLandscapeLeft duration:0];
}
因此,当即将移除该控制器(按下后退按钮)时,它会发送一条消息,表明它应该返回横向(它不会向左或向右转,因为前一个控制器会从那里自动旋转到正确的方向)。这是在objective-c中,但我确信在swift中有一个类似的操作。你可能不得不混淆动画持续时间,如果它让事情看起来很奇怪,但我的工作完全与立即切换。