2012-07-08 47 views
2

我有一个UIViewController可以说它叫A.内部A,我已经添加了另一个名为B的UIViewController我还在A上添加另一个UIViewController,让我们叫它C.我遇到的问题是,当C不存在时(即:未添加到A的视图控制器),那么旋转给我适当的大小,但是当C被添加到A.然后UIViewContoroller的B没有接收到正确的帧调整。为什么是这个以及如何解决这个问题?UIViewController遏制方向更改

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

回答

3

更新:

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

我有一个UIViewController可以说,这就是所谓的A.内,我已经添加 另一UIViewController中称为B.我也在另一 的UIViewController对A,让称它为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没有意义。无论如何,这是我原来的答复的基础上,假设你必须一直在谈论以下情形:

  • 乙& 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前面)的 。

你是说,你没有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 removeFromParentViewController];

如果您可以澄清您的或关于我上面的解释(或曲解)的原始问题,所以我们知道你在做什么?我已经在容器中看到了一些关于框架大小的奇怪东西,但我想确保我首先理解你的问题。

原文:

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

但是,将不发送的方法的非活动视图控制器。看起来你必须在子控制器的viewWillAppear上做一些方向检查。

注意,如果不是加载所有控制器的前面,你的时间这样做只是(有点像标签视图控制器),这个问题就会消失。

+0

这well..the默认是YES,那么它会自动将其转发。为什么我必须在viewWillAppear中做到这一点?接下来的方向变化会发生什么? – xonegirlz 2012-07-08 07:17:25

+0

@xonegirlz我很抱歉,但我automaticallyForwardAppearanceAndRotationMethodsToChildViewControllers只是一个玩笑/赞扬一个可怕的相关方法只是在外围与你原来的问题。我的主要观点是无关的这种方法,而是我的想法是,如果从小孩B到Child C级的容器中的转变,即小孩B不会收到旋转活动,所以如果你想要做旋转逻辑,你必须这样做当你转换回B.但我想我可能严重误解了你的问题,所以看到我上面修改的问题。 – Rob 2012-07-08 10:55:14

+0

@xonegirlz顺便说一下,我在容器视图中理解'self.view.frame'时一定会看到一些奇怪的行为。我现在依赖子视图控制器的'self.view.frame',它似乎更可靠。我怀疑视图控制器遏制处理旋转事件时存在一些错误。 – Rob 2012-07-09 17:55:01