更新:
我意识到我可能误解了最初的问题。但要正确回答这个问题,我需要澄清你在说什么。所以,你说:
我有一个 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
。
请注意,如果不是预先加载所有控制器,而是及时执行(有点像选项卡视图控制器),这个问题就会消失。