objective-c – 多个呈现的视图控制器和iPad上的旋转

我最近在将一些代码从iPhone应用程序移植到iPad时遇到了问题.它可能与 here所描述的问题有关,但我发现该问题的解释/解决方案并不令人满意.场景是这样的:

>视图控制器’A'(根视图控制器)使用“表单”模式演示样式呈现模态视图控制器(称为’B’).
>视图控制器B使用“全屏”模式演示样式呈现视图控制器“C”.
>旋转iPad,而视图控制器C是最顶级的视图控制器.
>一旦解除C,B将重新显示,但方向不正确.

据我所知,链接多个呈现的视图控制器应该没有问题 – 实际上,Presenting View Controllers from Other View Controllers文档中明确支持这种行为.我还在iOS 5 Release Notes中阅读了以下声明:

Rotation callbacks in iOS 5 are not applied to view controllers that are presented over a full screen. What this means is that if your code presents a view controller over another view controller,and then the user subsequently rotates the device to a different orientation,upon dismissal,the underlying controller (i.e. presenting controller) will not receive any rotation callbacks. Note however that the presenting controller will receive a viewWillLayoutSubviews call when it is redisplayed,and the interfaceOrientation property can be queried from this method and used to lay out the controller correctly.

据我所知,这不会发生 – 视图控制器B接收到对-shouldAutoRotatetoInterfaceOrientation的调用,但此调用中的interfaceOrientation参数的值是视图控制器B在呈现视图控制器C时的接口方向的值,而不是值解雇后C的界面取向由于我们在iPad上,所有这些视图控制器都在-shouldAutoRotatetoInterfaceOrientation中返回YES.因此B视图的界限永远不会改变,所以-willLayoutSubviews永远不会被调用.

我已经尝试在B解除它之前将视图控制器C的方向保存在回调中,然后在下次使用该信息时调用theAouldAutoRotatetoInterfaceOrientation,并且仅在C被解除时返回Y的方向.这修复了,在没有进行此检查的情况下出现的损坏的UI,但是视图控制器B没有将其界面方向更新为此值,因此后续的模态演示将从设备的错误侧进行动画制作.

有没有人能够成功获得这样的视图控制器配置?它似乎并不像一个场景那么不寻常,所以我有点惊讶它没有像我最初预期的那样工作.

提前致谢.

解决方法

在我看来,如果你不使用导航控制器,多个链式模态视图控制器会导致令人困惑和恼人的用户体验.我认为View控制器B应该在导航控制器中(如果你不想要,你不必显示nab栏).

模态演示实际上应该是针对单个死胡同的实体(单个视图控制器或包含多个子视图控制器的导航控制器).

出于兴趣,您是说这在iPhone上运行良好但在iPad上运行不正常吗?或者你不允许在iPhone版本上轮换?

我还发现this thread表示从根视图控制器呈现模态视图控制器可能有所帮助.

相关文章

本程序的编译和运行环境如下(如果有运行方面的问题欢迎在评...
水了一学期的院选修,万万没想到期末考试还有比较硬核的编程...
补充一下,先前文章末尾给出的下载链接的完整代码含有部分C&...
思路如标题所说采用模N取余法,难点是这个除法过程如何实现。...
本篇博客有更新!!!更新后效果图如下: 文章末尾的完整代码...
刚开始学习模块化程序设计时,估计大家都被形参和实参搞迷糊...