0

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

我有一个链从windowrootViewController使用shouldAutorotatesupportedInterfaceOrientations下降到目前我个人视图控制器设置。

所以,我有一个视图控制器,只支持肖像。下一个推动支持景观。

当我推动支持风景的那个,然后旋转设备时,一切都会旋转。到现在为止还挺好。

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

我想将横向视图推送到其右侧(纵向视图控制器的顶部或底部),而纵向视图控制器显示在背景中。

我该如何做到这一点?

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

回答

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,因此它只涉及视图控制器的直接后代(即在当前视图控制器的视图层次结构中为其后代的视图控制器)。直系后裔可以进一步从那里传递请求。

无论演示者如何,都将模式窗口视为完全独立的链。

换句话说,信任UIKit