【问题标题】:popViewControllerAnimated: From Landscape To PortraitpopViewController 动画:从横向到纵向
【发布时间】:2017-07-27 03:47:40
【问题描述】:

我在将 UINavigationController(子类)从横向视图弹出到纵向视图时遇到问题。

我使用shouldAutorotate 和supportedInterfaceOrientations 设置了从window 的rootViewController 到我展示的各个视图控制器的链。

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

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

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

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

我怎样才能做到这一点?

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

【问题讨论】:

    标签: ios objective-c uinavigationcontroller uiinterfaceorientation uiviewanimationtransition


    【解决方案1】:

    经过几天的实验,我发现了我的问题所在。希望这对将来的人有所帮助。

    我试图过度设计链条。

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

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

    - (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,使其仅涉及视图控制器的直接后代(即views 是当前视图控制器视图层次结构中的后代的视图控制器)。直接后代可以从那里进一步向下传递请求。

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

    换句话说,信任UIKit。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-08-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-25
      • 2012-10-12
      • 1970-01-01
      • 2023-03-05
      相关资源
      最近更新 更多