2

我有一个在 NavigationController 中嵌入了几个 VC 的应用程序。

我需要将所有 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 转到另一个时,一切都很好。应该只有肖像的视图只有肖像。然后我打开未修改的视图并按预期更改 interfaceOrientation。

但是,假设我将最后一个未修改的视图保留在 Landscape 中,然后按 NavBar 中的后退按钮并转到上一个控制器(已修改为仅纵向)。VC 的布局显示为横向。

如果我一直按下返回按钮,所有其他 VC 的行为就像他们从未被告知只是肖像一样。

我使用了这篇文章Korey Hinton,锁屏旋转

4

2 回答 2

1

我想我能够复制你描述的场景。不幸的是,我试图强制它更新的正常方法不起作用,但我确实发现这个 SO 答案似乎有效。把它放在你返回的视图控制器中viewDidAppear

override func viewDidAppear(animated: Bool) {
    super.viewDidAppear(animated)

    let value = UIInterfaceOrientation.Portrait.rawValue
    UIDevice.currentDevice().setValue(value, forKey: "orientation")
}

这个修复似乎对我有用。不过,这是一个相当艰难的过渡。我希望这会有所帮助

于 2015-05-28T19:48:29.323 回答
0

我在呈现视图控制器和方向锁定差异时遇到了这个问题。我将此添加到“解锁”控制器中:

- (void)viewWillDisappear:(BOOL)animated
{
    [super viewWillDisappear:animated];
    [self willRotateToInterfaceOrientation:UIInterfaceOrientationLandscapeLeft duration:0];
}

因此,当该控制器即将被移除(按下后退按钮)时,它会发送一条消息,表明它应该返回横向(左右无关,因为前一个控制器将从该控制器自动旋转到正确的方向)。那是在objective-c中,但我确信swift中有类似的操作。如果它让事情看起来很奇怪,你可能不得不弄乱动画持续时间,但我的立即切换效果很好。

于 2015-05-27T15:08:02.427 回答