我有一个viewController层次结构(在情节提要中创建),具有以下允许的方向:
+---------------+ +------------------+ +------------------+
+ VC1 + + VC2 + + VC3 +
+ + -> + + -> + +
+ Portrait Only + + All orientations + + All orientations +
+---------------+ +------------------+ +------------------+
为了使允许的旋转根据所有这些ViewController的
supportedInterfaceOrientations
和shouldAutorotate
方法工作,我使用以下简单实现创建了一个自定义的UINavigationController
子类:public class SingleOrientationNavigationController: UINavigationController {
public override func shouldAutorotate() -> Bool {
if let topVC = topViewController {
return topVC.shouldAutorotate()
}
return false
}
public override func supportedInterfaceOrientations() -> UIInterfaceOrientationMask {
if let topVC = topViewController {
return topVC.supportedInterfaceOrientations()
}
return UIInterfaceOrientationMask.Portrait
}
}
设备旋转时,将为navigationController(这是我的应用程序的根控制器)调用方法
shouldAutorotate
,该方法将返回最顶层视图控制器的值。当我按下可自由旋转的VC2和VC3时,一切都会顺利进行。现在,我按VC2(因为VC1仅支持纵向),所以按VC2,旋转屏幕(因为VC2支持所有方向),然后弹出到根视图控制器。我得到以下调试跟踪:
VC1(在第0行和第1行)调用
supportedInterfaceOrientations
方法,因此系统可以知道需要旋转才能正确显示VC1:旋转工作正常。当VC3处于横向模式时,当我尝试使用
popToRootViewControllerAnimated
从VC3弹出到VC1时,就会出现问题。当与服务器的连接丢失时,会发生这种情况,因此我必须回到根视图控制器。在这种情况下,由于未调用
supportedInterfaceOrientations
(对于VC1和VC2均未调用),并且VC1以横向显示,因此我无法获取以前的跟踪。如何直接从VC3弹出VC1,并以正确的方向显示它?我知道我可以从VC3弹出到VC2,然后从VC2弹出到VC1,但如果可能的话,我想直接从VC3弹出到VC1。
最佳答案
我是Stack的新手,我希望现在回答这个问题不晚,但是我和作者的处境相同。
想象一下,您只有VC4纵向模式,并且如果您尝试从VC3(横向)推入它,您的VC4也将以横向模式出现。似乎未调用supportedInterfaceOrientations函数。
为了解决您的问题VC3 => VC1我发现了一个“ hack” https://stackoverflow.com/a/15057537/6257992(我使用IOS 7方法)
我和你有相同的实现。
创建一个覆盖自定义NavigationController中定义的2个方法的BlankViewController
将链接中的代码添加到VC1的ViewWillAppear中,并将UIViewController替换为Blank
对于“体面的”动画:
PopToRootViewController = true
PresentViewController =否
DismissViewController = true
PS:与在模拟器中相比,手机上的动画效果更好。
如果您找到更好的方法或有任何评论,请分享。
关于ios - 使用popToRootViewController旋转,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36626296/