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