Ios 使用popToRootViewController旋转

Ios 使用popToRootViewController旋转,ios,swift,uiviewcontroller,uinavigationcontroller,Ios,Swift,Uiviewcontroller,Uinavigationcontroller,我有一个具有以下允许方向的viewController层次结构(在故事板中创建): +---------------+ +------------------+ +------------------+ + VC1 + + VC2 + + VC3 + + + -> + + -> +

我有一个具有以下允许方向的viewController层次结构(在故事板中创建):

+---------------+       +------------------+       +------------------+
+      VC1      +       +        VC2       +       +        VC3       +
+               +   ->  +                  +   ->  +                  +
+ Portrait Only +       + All orientations +       + All orientations +   
+---------------+       +------------------+       +------------------+
为了使允许的旋转能够根据所有这些ViewController的
支持的接口方向
应自动旋转
方法工作,我创建了一个自定义
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和VC3可以自由旋转


现在,我按下VC2(在纵向中,因为VC1只支持纵向),旋转屏幕(因为VC2支持所有方向),然后弹出到根视图控制器。我得到了以下调试跟踪:

VC1(第0行和第1行)调用了
supportedInterfaceOrientations
方法,因此系统可以知道需要旋转才能正确显示VC1:旋转工作正常

当VC3处于横向模式时,当我尝试使用
PoptorootViewController-imated
从VC3弹出到VC1时,就会出现问题。这种情况发生在与服务器的连接丢失时,因此我必须返回根视图控制器。 在这种情况下,我无法获取上一个跟踪,因为未调用
supportedInterfaceOrientations
(对于VC1和VC2都不调用),并且VC1显示在横向中


如何从VC3直接弹出到VC1,并以正确的方向显示?我知道我可以从VC3跳到VC2,然后从VC2跳到VC1,但如果可能的话,我想直接从VC3跳到VC1。

我是新手,我希望回答这个问题不会太晚,但我和作者的处境一样。 假设您只有一个纵向的VC4,如果您尝试从VC3(横向)推送它,您的VC4也将显示在横向。看起来supportedInterfaceOrientations函数未调用

为了解决您的问题VC3=>VC1,我发现了一个“黑客”(我使用IOS 7方法)

我有和你一样的实现

  • 创建覆盖自定义NavigationController中定义的2个方法的BlankViewController
  • > P>在VC1中添加链接到VC1中的代码,并用空白替换UIViewController 要获得“体面”的动画:

    • PopToRootViewController=true
    • PresentViewController=false
    • DismissViewController=true
    PS:手机上的动画比模拟器上的动画好看。


    如果您找到更好的方法或有任何意见,请与我们分享。

    我认为这是不可能的。唯一一次我觉得我能够强制旋转的时候,是当我忽略情态动词,甚至不显示它们的时候。我想如果你在VC1上显示一个导航控制器,然后当你想回到VC1时,你可以关闭它,制作自定义动画,让它看起来像是从右边推出来的,或者是从左边弹出的。但是,如果有一个很好的解决方案:3