我有一个viewController层次结构(在情节提要中创建),具有以下允许的方向:

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


为了使允许的旋转根据所有这些ViewController的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,旋转屏幕(因为VC2支持所有方向),然后弹出到根视图控制器。我得到以下调试跟踪:

ios - 使用popToRootViewController旋转-LMLPHP

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/

10-13 04:04