UIViewController 遏制 - 新孩子不知道旋转
Posted
技术标签:
【中文标题】UIViewController 遏制 - 新孩子不知道旋转【英文标题】:UIViewController Containment - New Children do not know rotation 【发布时间】:2012-02-01 15:46:16 【问题描述】:我的应用从根视图控制器开始。它的工作是在应用程序准备好之前显示一个启动屏幕。初始屏幕位于单独的视图控制器 (splashVC
) 中。当应用程序准备就绪时,appDelegate 会调用根视图控制器中的 present 方法。从这里开始,根视图控制器添加另一个视图控制器 (mainVC
) 作为子视图控制器,然后使用
[splashVC willMoveToParentViewController:nil];
[self transitionFromViewController:splashVC
toViewController:mainVC
duration:0.5
options:UIViewAnimationOptionTransitionCrossDissolve
animations:^
[self.view addSubview:mainVC.view];
[splashVC.view removeFromSuperview];
completion:^(BOOL finished)
[splashVC removeFromParentViewController];
];
我的问题是,如果我以横向模式启动应用程序,那么我会看到 Default.png 加载,然后是我的启动屏幕,该屏幕会自动旋转到横向。这一切都说得通。但是,当mainVC
出现在屏幕上时,它的视图似乎卡在纵向上——视图并没有一直延伸到屏幕的右边框。根视图控制器可以很好地自动调整大小 - 我为其添加了背景颜色,因此我可以看到 mainVC
并没有完全覆盖它。我认为这可能是因为 mainVC
在轮换发生时不是孩子。所以我在根视图控制器的 loadView 方法中添加了mainVC
,其中添加了splashVC
。我只是想弄清楚为什么在显示mainVC
时,它不是自动调整大小的。如果我添加方法 -
willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration
然后我可以看到旋转发生在 mainVC
加载之前,因为它从未在 mainVC 中调用。我不想修改视图的大小。关于如何处理这个问题的任何帮助都会很棒。也许我在我的容器中遗漏了一些东西,但我正在使用 addChildViewController 和 didMoveToParentViewController 方法将我的视图控制器作为子视图控制器添加到根视图控制器。
编辑 - 我注意到在 mainVC 的 initWithNibNamed... 方法中 self.interfaceOrientation 的值是纵向的,但它的 viewDidLoad 方法的值是横向的。我不确定是否有一种好方法可以解释这一点。似乎在加载笔尖时发生了旋转。
提前致谢。
【问题讨论】:
【参考方案1】:ViewController 仅在其作为视图层次结构的一部分呈现时才获得方向更新,当它接收到视图已更改的消息时。 (在这种情况下,该消息已经发出)例外情况是如果您使用苹果方法进行导航。那些在被推送/呈现时正确设置视图。
尝试使用基本导航并使用推送和弹出在屏幕之间切换。或者,如果您真的想摆脱可以调用的那个视图控制器,您仍然可以为它们设置不同的动画。
navigationController setViewControllers:(NSArray *) 动画:(BOOL)
并传入一个包含新视图控制器的数组。如果您将动画设置为 NO,您可以使用相同的动画块进行自定义。
【讨论】:
【参考方案2】:为了解决这个问题,在设置视图控制器时添加了第二个视图控制器作为子视图控制器,而不是等到我展示视图控制器之前。
【讨论】:
以上是关于UIViewController 遏制 - 新孩子不知道旋转的主要内容,如果未能解决你的问题,请参考以下文章
UIViewController 容器:允许孩子有不同的方向
将导航从 UITabbarController 推送到 UIViewController