2

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

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

4

1 回答 1

3

更新:

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

我有一个 UIViewController,可以说它叫做 A。在 A 中,我添加了另一个 UIViewController,称为 B。我还在 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。无论如何,这是我最初回答的基础,假设您一定在谈论以下场景:

  • B & 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

请注意,如果不是预先加载所有控制器,而是及时执行(有点像选项卡视图控制器),这个问题就会消失。

于 2012-07-08T03:51:04.627 回答