在NavBar中返回时,锁定视图上的设备方向会失败

时间:2015-05-27 14:56:36

标签: ios swift uideviceorientation

我有一个应用程序,其中有几个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的行为就像他们从未被告知只是肖像。

我使用了这篇文章Korey Hinton, Lock Screen Rotation

2 个答案:

答案 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中有一个类似的操作。你可能不得不混淆动画持续时间,如果它让事情看起来很奇怪,但我的工作完全与立即切换。