我无法将UINavigationController
(子类)从横向视图弹出到纵向视图。
我使用window
rootViewController
使用shouldAutorotate
和supportedInterfaceOrientations
向我设置的各个视图控制器设置链。
所以,我有一个仅支持肖像的视图控制器。推出的下一个也支持横向。
当我推动支持横向的设备然后旋转设备时,一切都会旋转。到目前为止,非常好。
现在,当我弹回第一个视图时,两个视图都会在动画之前旋转。因此,第二个viewController的横向视图(由于旋转变换而非常小)被推到纵向屏幕的右侧。
我希望横向视图被推向右侧(纵向视图控制器的顶部或底部),,而纵向视图控制器显示在后台。
我该如何做到这一点?
我想我可能会尝试使用动画控制器,但是当以不同的方向弹出到视图控制器时,UINavigationController
的委托方法navigationController:animationControllerForOperation:
不会被调用
答案 0 :(得分:0)
经过几天的实验,我发现了我的问题所在。希望这将有助于未来的人。
我试图过度设计链条。
我有一个带有子标签栏控制器的自定义容器,其中包含多个导航控制器,其中包含具有不同方向要求的视图控制器。
我的主要缺点是假设即使提供了模态窗口,系统仍会首先询问窗口的根视图控制器。为了解释这种情况,我在容器中添加了一个如下所示的检查:
- (UIInterfaceOrientationMask)supportedInterfaceOrientations {
if (self.presentedViewController) { // This check is wrong! Don't do this!
return [self.presentedViewController supportedInterfaceOrientations];
}
// Pass request to child view controller
}
然而,这从根本上导致了我的问题有两个方面。
首先,如果没有这个检查,UIKit将自动检测模态视图控制器并直接询问其supportedInterfaceOrientations
。
其次,UIKit处理动画的方式涉及呈现几个我们通常不知道的内部视图控制器。通过检查presentingViewController
中的模态视图控制器,检查是捕获它们并询问所有人supportedInterfaceOrientations
。 UIKit并不意味着这样做,所以我就是干扰它的操作。
修复是为了实现supportedInterfaceOrientations
,因此它只涉及视图控制器的直接后代(即view
s是当前视图控制器视图层次结构中的后代的视图控制器)。直接后代可以进一步从那里传递请求。
将模态窗口视为完全独立的链,无论演示者如何。
换句话说,信任UIKit
。