我有一个viewController层次结构(在故事板中创建),具有以下允许的方向:
+---------------+ +------------------+ +------------------+
+ VC1 + + VC2 + + VC3 +
+ + -> + + -> + +
+ Portrait Only + + All orientations + + All orientations +
+---------------+ +------------------+ +------------------+
为了让允许的旋转按照所有这些ViewControllers的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支持所有方向),然后弹出到根视图控制器。我得到了以下调试跟踪:
为VC1调用supportedInterfaceOrientations
方法(在第0行和第1行),因此系统可以知道它需要旋转才能正确显示VC1:旋转工作正常。
当我尝试使用popToRootViewControllerAnimated
从VC3弹出到VC1时,问题出现了,而VC3处于横向模式。当与服务器的连接丢失时会发生这种情况,因此我必须返回到根视图控制器。
在这种情况下,我无法获得之前的跟踪,因为supportedInterfaceOrientations
未被调用(VC1和VC2都没有),VC1以横向显示。
如何直接从VC3弹出VC1,并以正确的方向显示?我知道我可以从VC3弹出到VC2然后从VC2弹出到VC1,但如果可能的话,我想直接从VC3转到VC1。
答案 0 :(得分:0)
我是Stack的新手,我希望不要迟到回答这个问题,但我和作者的情况相同。 想象一下,你只有一个VC4的肖像,如果你试图从VC3(风景)推送它,你的VC4也会出现在风景中。看起来supportInterfaceOrientations函数不是调用...
解决您的问题VC3 => VC1我找到了一个" hack" https://stackoverflow.com/a/15057537/6257992(我使用IOS 7方法)
我和你有相同的实现。
将链接中的代码添加到VC1的ViewWillAppear中,并将空白替换为UIViewController 对于一个体面的"动画:
PS:动画在手机上比在模拟器中看起来更好。
如果您找到更好的方式或有任何评论,请分享。