如何让儿童视图控制器在横向呈现时理解其框架?

时间:2013-12-14 02:36:18

标签: ios cocoa-touch uiview uiviewcontroller ios7

我将使用以下代码从父视图控制器呈现子视图控制器:

self.childVC = [[ChildVC alloc] init];
[self addChildViewController:self.childVC];
self.childVC.view.frame = self.view.bounds;
self.childVC.alpha = 0.1;
[self.view addSubview:self.childVC.view];
[UIView
    animateWithDuration:0.3
    delay:0.0
    options:UIViewAnimationOptionCurveEaseInOut
    animations:^(void) {
        self.view.alpha = 1.0;
    }
    completion:^(BOOL finished) {
        [self.childVC didMoveToParentViewController:self];
    }
];

父视图控制器支持所有方向。当父母处于肖像方向时呈现孩子时,孩子的框架符合预期:

viewDidLoad:   <UIView: 0xeb9f70; frame = (0 0; 320 568); autoresize = W+H;
viewDidAppear: <UIView: 0xeb9f70; frame = (0 0; 320 568); autoresize = W+H;

但是,当父母处于横向方向时,孩子出现时,孩子的框架很奇怪:

viewDidLoad:   <UIView: 0xeb9f70; frame = (0 0; 320 568); autoresize = W+H;
viewDidAppear: <UIView: 0xeb9f70; frame = (0 0; 568 320); autoresize = W+H;

在viewDidLoad中,孩子认为它的框架是纵向的。然后它在viewDidAppear中纠正自己。这种零星的框架变化使得孩子的动画看起来很烦躁。当孩子以横向方向发射时,如何使框架正确且一致?

2 个答案:

答案 0 :(得分:0)

您是否实施了supportedInterfaceOrientationspreferredInterfaceOrientationForPresentation

我是从ViewController Programing Guide

找到的
  

在iOS 5及更早版本中,视图控制器有时可以参与旋转过程,即使它不是最顶层的全屏视图控制器。当容器视图控制器向其子级询问其支持的接口方向时,通常会发生这种情况。在实践中,儿童覆盖父母的能力很少有用。考虑到这一点,您应该考虑在必须支持iOS 5的应用程序中尽可能多地模拟iOS 6行为:

     

在全屏显示的根视图控制器或视图控制器中,选择对您的用户界面有意义的界面方向的子集。   在子控制器中,通过设计自适应视图布局来支持所有默认分辨率。

并且从this您可以看到旋转发生时发生了什么。

希望它可以帮助你在你的情况下弄明白。

答案 1 :(得分:0)

viewDidLoad表示已加载所有元素时处于原始状态的视图。布局尚未开始。如果视图控制器是在故事板或笔尖中定义的,则它将具有从解码器中读取的值。你不应该在那里开始你的动画,但是在viewWillAppear中,应该在视图布局(viewDidLayout)之后调用它。