UIViewController包含方向更改

时间:2012-07-08 02:26:46

标签: iphone objective-c ios ipad

我有一个UIViewController让我们说它叫做A.在A中,我添加了另一个名为B的UIViewController。我还在A上添加另一个UIViewController,让我们调用它C.我遇到的问题是,当C不是present(即:没有添加到A的视图控制器中)然后旋转给我正确的大小,但是当C被添加到A.然后UIViewContoroller的B没有收到正确的帧调整。为什么这样,我该如何解决这个问题?

基本上当我在B的willAnimateToInterfaceRotation中旋转时,无论方向如何,框架都保持不变。所以说B是纵向的,大小是768 x 1004.然后我有一个按钮,在A中加C(C在B的前面)。当我旋转它打印出框架的大小是768x1004。但是,如果我解除C(即:从父视图控制器中删除它,在这种情况下为A)。当我旋转框架宽度时,相应地改变。

1 个答案:

答案 0 :(得分:3)

<强>更新

我意识到我可能误解了原来的问题。但要正确回答这个问题,我需要澄清你在说什么。所以,你说:

  

我有一个UIViewController让我们说它叫做A. A,我补充说   另一个名为B的UIViewController。我也在添加另一个   A上的UIViewController,我们称之为C。

所以,从本质上讲,你已经完成了以下工作?

[A addChildViewController:B];
[B didMoveToParentViewController:A];
[A addChildViewController:C];
[C didMoveToParentViewController:A];

我做对了吗?无论如何,你继续说:

  

我遇到的问题是,当C不存在时(即:未添加到A中)   视图控制器)然后旋转给我正确的大小,

那么,你是说你从来没有调用addChildViewController:C一切都好吗?你继续:

  

......但是当C   添加到A.然后UIViewController的B没有收到   正确的帧调整。

那么,你是说你调用了addChildViewController:C,并且有transitionFromViewController:B toViewController:C?但如果是这样的话,B根本不会得到任何轮换事件。当你从B转换到C时,引用B.view.frame.size是没有意义的。无论如何,这是我原来答案的基础,假设你一定是在讨论以下场景: / p>

  • B&amp; C通过addChildViewController
  • 添加
  • B最初是在纵向活动时
  • transitionFromViewController:B toViewController:C
  • 您将设备旋转到横向,C获取旋转事件,但B没有,
  • transitionFromViewController回到B,现在查看控制器B接收与外观相关的方法,例如viewWillAppear,但在C处于活​​动状态时会错过任何轮换事件

因此,如果在这种情况下需要B检查基于旋转的逻辑,则必须在B viewWillAppear之类的方法中执行此操作(除非父视图控制器A在其之后显式调用其他内容) transitionFromViewController:C toViewController:B)。但我现在意识到你可能并不关心旋转事件的存在与否,而只是当你检查框架时,你会得到奇怪的结果。但是我不太了解你所描述的情景,所以让我们继续你的其余问题。

所以,你继续说:

  

基本上当我在B中旋转willAnimateToInterfaceRotation时   无论方向如何,框架都保持不变。所以说B在   肖像,大小为768 x 1004.

好的,我认为我们在那里很好。你继续:

  

然后我有一个添加的按钮   A中的C(C在B前面)。

你是说你做过transitionFromViewController:B toViewController:C吗?在视图控制器包含的上下文中,术语“在B前面”对我来说没有意义。 C不会在B前面转移。你从B转换到C.

  

旋转时打印出的尺寸   框架是768x1004。

这很奇怪。但是,更重要的是,什么是“768x1004”? C.view.frame.size?如果你从B转换到C,我认为引用B.view.frame.size是没有意义的。我不清楚你说的是报道“768x1004”。

无论如何,你继续:

  

但是,如果我解雇C(即:将其从中移除)   父视图控制器,在本例中为A)。当我旋转框架时   宽度相应变化。

当您说“将其从父级视图控制器中删除”时,我认为您的意思是:

  • 已调用transitionFromViewController:C toViewController:B
  • 警告C它会随[C willMoveToParentViewController:nil]
  • 消失
  • 然后使用[C removeFromParentViewController];
  • 删除它

如果你能澄清你关于我对上述解释(或误解)的原始问题,那么我们确切地知道你在做什么?我肯定在容器中看到了一些关于框架尺寸的奇怪东西,但我想确保我先了解你的问题。

<强>原始

automaticallyForwardAppearanceAndRotationMethodsToChildViewControllers。说真的,谁提出了这个方法名称?!?

但是这不会将方法发送到非活动视图控制器。看起来您必须在子控制器viewWillAppear上检查方向。

注意,如果不是预先加载所有控制器,而是及时完成(类似于标签视图控制器),这个问题就会消失。