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 容器:允许孩子有不同的方向

定位 UIViewController 包含子项

将导航从 UITabbarController 推送到 UIViewController

从其子 UIViewControllers 访问父 UIViewController

markdown CSS遏制(性能)

可拖动元素的遏制