在导航栏中返回时,在视图上锁定设备方向失败

Locking device orientation on a view fails when going back in NavBar

我有一个在 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。

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

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

我用过这个postKorey Hinton, Lock Screen Rotation

我在呈现的视图控制器和方向锁定差异方面遇到了这个问题。我将其添加到 "unlocked" 控制器中:

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

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

我想我能够复制您描述的场景。不幸的是,我尝试强制更新的正常方法不起作用,但我确实发现 this SO answer 似乎有效。把它放在你 return 回到 viewDidAppear:

的视图控制器中
override func viewDidAppear(animated: Bool) {
    super.viewDidAppear(animated)

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

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