在导航栏中返回时,在视图上锁定设备方向失败
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")
}
这个修复似乎对我有用。不过,这是一个相当艰难的过渡。希望对您有所帮助
我有一个在 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")
}
这个修复似乎对我有用。不过,这是一个相当艰难的过渡。希望对您有所帮助