popViewControllerAnimated:从Landscape到Portrait

时间:2017-03-07 03:42:00

标签: ios objective-c uinavigationcontroller uiinterfaceorientation uiviewanimationtransition

我无法将UINavigationController(子类)从横向视图弹出到纵向视图。

我使用window rootViewController使用shouldAutorotatesupportedInterfaceOrientations向我设置的各个视图控制器设置链。

所以,我有一个仅支持肖像的视图控制器。推出的下一个也支持横向。

当我推动支持横向的设备然后旋转设备时,一切都会旋转。到目前为止,非常好。

现在,当我弹回第一个视图时,两个视图都会在动画之前旋转。因此,第二个viewController的横向视图(由于旋转变换而非常小)被推到纵向屏幕的右侧。

我希望横向视图被推向右侧(纵向视图控制器的顶部或底部),,而纵向视图控制器显示在后台。

我该如何做到这一点?

我想我可能会尝试使用动画控制器,但是当以不同的方向弹出到视图控制器时,UINavigationController的委托方法navigationController:animationControllerForOperation:不会被调用

1 个答案:

答案 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