更新:
我意识到我可能误解了最初的问题。但要正确回答这个问题,我需要澄清你在说什么。所以,你说:
我有一个 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 对我来说没有意义。无论如何,这是我最初回答的基础,假设您一定在谈论以下场景:
- B & C 通过
addChildViewController添加,
- B 在纵向时最初处于活动状态,
- 你
transitionFromViewController:B toViewController:C,
- 您将设备旋转到横向,C 获得旋转事件,但 B 没有,
- 你
transitionFromViewController 回到 B,现在视图控制器 B 接收外观相关的方法,例如 viewWillAppear,但在 C 处于活动状态时将错过任何旋转事件
因此,如果您需要 B 在这种情况下检查基于旋转的逻辑,则必须在 B 的 viewWillAppear 之类的方法期间执行此操作(除非父视图控制器 A 在执行 @987654333 之后显式调用其他内容@)。但我现在意识到你可能并不关心旋转事件的存在与否,而只是当你检查框架时,你会得到奇怪的结果。但我不太明白你描述的场景,所以让我们继续你的问题。
所以,你继续说:
基本上当我在 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 willMoveToParentViewController:nil] 警告 C 它将消失
- 然后用
[C removeFromParentViewController];删除它
如果您能就我上面的解释(或误解)澄清您最初的问题,那么我们确切地知道您在做什么?我确实在容器中看到了一些关于框架尺寸的奇怪东西,但我想确保我首先理解你的问题。
原文:
见automaticallyForwardAppearanceAndRotationMethodsToChildViewControllers。说真的,这个方法名是谁想出来的?!?
但这不会将方法发送到非活动视图控制器。看起来您必须对子控制器的viewWillAppear 进行一些方向检查。
注意,如果不是预先加载所有控制器,而是及时加载(有点像标签视图控制器),这个问题就会消失。