使用popToRootViewController进行旋转

时间:2016-04-14 14:32:35

标签: ios swift uiviewcontroller uinavigationcontroller

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

+---------------+       +------------------+       +------------------+
+      VC1      +       +        VC2       +       +        VC3       +
+               +   ->  +                  +   ->  +                  +
+ Portrait Only +       + All orientations +       + All orientations +   
+---------------+       +------------------+       +------------------+

为了让允许的旋转按照所有这些ViewControllers的supportedInterfaceOrientationsshouldAutorotate方法工作,我创建了一个自定义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支持所有方向),然后弹出到根视图控制器。我得到了以下调试跟踪:

enter image description here

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

当我尝试使用popToRootViewControllerAnimated从VC3弹出到VC1时,问题出现了,而VC3处于横向模式。当与服务器的连接丢失时会发生这种情况,因此我必须返回到根视图控制器。 在这种情况下,我无法获得之前的跟踪,因为supportedInterfaceOrientations未被调用(VC1和VC2都没有),VC1以横向显示。

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

1 个答案:

答案 0 :(得分:0)

我是Stack的新手,我希望不要迟到回答这个问题,但我和作者的情况相同。 想象一下,你只有一个VC4的肖像,如果你试图从VC3(风景)推送它,你的VC4也会出现在风景中。看起来supportInterfaceOrientations函数不是调用...

解决您的问题VC3 => VC1我找到了一个" hack" https://stackoverflow.com/a/15057537/6257992(我使用IOS 7方法)

我和你有相同的实现。

  1. 创建一个覆盖自定义NavigationController
  2. 中定义的2个方法的BlankViewController
  3. 将链接中的代码添加到VC1的ViewWillAppear中,并将空白替换为UIViewController 对于一个体面的"动画:

    • PopToRootViewController = true
    • PresentViewController = false
    • DismissViewController = true
  4. PS:动画在手机上比在模拟器中看起来更好。

    如果您找到更好的方式或有任何评论,请分享。