我将使用以下代码从父视图控制器呈现子视图控制器:
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中纠正自己。这种零星的框架变化使得孩子的动画看起来很烦躁。当孩子以横向方向发射时,如何使框架正确且一致?
答案 0 :(得分:0)
您是否实施了supportedInterfaceOrientations
和preferredInterfaceOrientationForPresentation
。
我是从ViewController Programing Guide
找到的在iOS 5及更早版本中,视图控制器有时可以参与旋转过程,即使它不是最顶层的全屏视图控制器。当容器视图控制器向其子级询问其支持的接口方向时,通常会发生这种情况。在实践中,儿童覆盖父母的能力很少有用。考虑到这一点,您应该考虑在必须支持iOS 5的应用程序中尽可能多地模拟iOS 6行为:
在全屏显示的根视图控制器或视图控制器中,选择对您的用户界面有意义的界面方向的子集。 在子控制器中,通过设计自适应视图布局来支持所有默认分辨率。
并且从this您可以看到旋转发生时发生了什么。
希望它可以帮助你在你的情况下弄明白。
答案 1 :(得分:0)
viewDidLoad
表示已加载所有元素时处于原始状态的视图。布局尚未开始。如果视图控制器是在故事板或笔尖中定义的,则它将具有从解码器中读取的值。你不应该在那里开始你的动画,但是在viewWillAppear
中,应该在视图布局(viewDidLayout
)之后调用它。