如果我添加一个子视图控制器,并用它来呈现另一个视图控制器,整个根视图会被替换吗?

Posted

技术标签:

【中文标题】如果我添加一个子视图控制器,并用它来呈现另一个视图控制器,整个根视图会被替换吗?【英文标题】:If I add a child view controller, and use it to present another view controller, the whole root view is replaced? 【发布时间】:2012-09-22 21:09:26 【问题描述】:

ios 5 上,如果我添加一个子视图控制器 addChildViewController 并添加它的视图,比如说,在 (0, 100) 并覆盖整个底部屏幕,然后在这个新的子视图控制器中,呈现另一个视图控制器使用presentViewController 和翻转动画,我以为只有子视图会翻转并呈现一个新视图,但结果是整个视图(除了状态栏之外的整个屏幕)都被翻转了?

我认为他们以“独立的方式”工作?即如果一个子视图控制器呈现另一个视图控制器,替换的是子视图控制器的视图,而不是根视图?

(因此,如果呈现的视图控制器的视图具有黄色背景,现在除了状态栏之外的整个屏幕都具有黄色,而不是仅从 (0,100) 开始并覆盖底部屏幕的子视图控制器的视图)

【问题讨论】:

【参考方案1】:

设置childViewController.definesPresentationContext = YES

【讨论】:

【参考方案2】:

如果您只想翻转子视图控制器,则需要将控制器的视图添加到根视图控制器的视图层次结构中(呸!说快 2 倍!),然后使用 UIView 动画为它们制作动画。

[UIView transitionFromView:controllerB.view
                    toView:controllerC.view
                  duration:0.33
                   options:UIViewAnimationOptionCurveEaseInOut | UIViewAnimationOptionTransitionFlipFromLeft
                completion:^(BOOL finished) 
                    // whatever completion code you need
                ];

【讨论】:

我认为这会起作用,只是我最初希望通过各种类型的视图控制器以“自包含”的方式完成所有事情 @JeremyL Apple 允许子视图控制器在很多事情中解决以下问题:我有多个控制器,但我不希望他们创建这些委托调用阶梯只是为了做一些事情就像在堆栈上推送一个新的视图控制器一样简单,或者在您的情况下,呈现一个模态视图控制器。 UIViewController 收容并非旨在成为一个独立的“让我做一些过渡”。

以上是关于如果我添加一个子视图控制器,并用它来呈现另一个视图控制器,整个根视图会被替换吗?的主要内容,如果未能解决你的问题,请参考以下文章

addSubview与呈现模式ViewController之间的区别?

如何将视图控制器从视图控制器推送为全屏幕,呈现为半模式

打破父约束的子视图约束

呈现子视图控制器的自定义容器视图控制器子项

在关闭另一个模式视图控制器后呈现一个模式视图控制器

在模态呈现另一个视图控制器后视图控制器会发生啥