popViewController 动画:从横向到纵向

popViewControllerAnimated: From Landscape To Portrait

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

我使用 shouldAutorotatesupportedInterfaceOrientationswindowrootViewController 到我展示的各个视图控制器建立了一个链。

所以,我有一个只支持纵向的视图控制器。下一个推送也支持横屏

当我按下支持横向的然后旋转设备时,一切都在旋转。到目前为止,还不错。

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

我希望横向视图向右推(纵向视图控制器的顶部或底部),而纵向视图控制器是在背景中显示。

我怎样才能做到这一点?

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

经过几天的试验,我弄清楚了我的问题所在。希望这对以后的人有所帮助。

我试图过度设计链条。

我有一个带有子选项卡栏控制器的自定义容器,其中包含多个导航控制器,其中包含具有不同方向要求的视图控制器。

我的主要失败是假设即使出现模态 window,系统仍会首先询问 window 的根视图控制器。为了解决这种情况,我在容器中添加了一个检查,如下所示:

- (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 是当前视图控制器视图层次结构中的后代的视图控制器)。直系后代可以进一步向下传递请求。

将模态 windows 视为一个完全独立的链,与演示者无关。

换句话说,信任UIKit