我已经实现了一个视图控制器,它提供了一个类似于 UINavigationController 的导航结构。它正在使用视图控制器包含。所有视图控制器都作为子级添加。
当我在此导航流程中从视图控制器呈现模态视图控制器时,底层视图在自定义转换期间消失,用户只能查看下面的窗口视图。
[UIView animateWithDuration:0.35 animations:^{
self.view.transform = CGAffineTransformMakeScale(0.4, 0.4);
self.view.alpha = 0.0;
} completion:^(BOOL finished) {
[[self presentingViewController] dismissViewControllerAnimated:NO completion:nil];
}];
这是一个非常不和谐的经历。以前,此动画会缩小模态视图控制器的视图并将其淡入下方呈现视图控制器的视图。正如我之前所说,现在用户可以看到 Window 的视图(目前还没有设置颜色值)。
参考 View Controller 文档,我觉得好像我已经设置了所有正确的字段,但是,有些地方是不正确的。
当视图控制器希望该视图控制器执行任务时,它会呈现另一个视图控制器。呈现视图控制器负责此行为。它配置呈现的视图控制器,从它接收信息,并最终将其关闭。然而,当它被呈现时,呈现的视图控制器的视图被临时添加到窗口的视图层次结构中。
我的呈现视图控制器是我的自定义导航控制器,呈现的视图控制器是一个模态视图控制器,它允许用户撰写对话。我的应用程序的窗口根视图控制器已正确配置为我的自定义导航控制器。
我还阅读了有关演示上下文的更多信息,并将我的自定义导航控制器配置为将定义PresentationContext 设置为 YES。
当一个视图控制器被呈现时,它所覆盖的屏幕部分由另一个视图控制器提供给它的呈现上下文定义。提供呈现上下文的视图控制器不需要与呈现它的视图控制器相同。图 1-15 显示了与图 1-14 相同的视图控制器层次结构。您可以看到内容视图呈现了视图控制器,但它没有提供呈现上下文。相反,视图控制器由选项卡控制器呈现。因此,即使呈现视图控制器仅覆盖选项卡视图控制器提供给它的屏幕部分,呈现的视图控制器也会使用选项卡视图控制器拥有的整个区域。在我的自定义导航控制器中,我没有覆盖任何与视图控制器的呈现或解除相关的方法。添加的所有子视图控制器都作为 childViewControllers 添加,并且它们的视图已添加到此自定义导航控制器中。
- 为什么自定义转换会显示 Window 的视图,而不是尊重提供演示上下文的自定义包含视图控制器?
- 为什么传统的过渡动画会按预期工作?