UINavigationController 清除背景色

Posted

技术标签:

【中文标题】UINavigationController 清除背景色【英文标题】:UINavigationController clear background color 【发布时间】:2014-08-12 20:42:34 【问题描述】:

那个简单的例子,但不起作用;

我在 NavigationConroller 的内部有 ViewController,然后我想添加新的 ViewConroller 及其自导航控制器。

在主视图控制器中:

CustomViewController *vc = [[CustomViewController alloc] init];
NewNavigationVC *nav = [[NewNavigationVC alloc] initWithRootViewController:vc];

[self presentViewController:nav animated:NO completion:nil];

两个控制器的背景颜色清晰,但仍为黑色。 导航栏我可以清楚,但不是视图。

更新:

例如,如果我将 self.window.backroundColor 更改为红色,则可行但不清楚

更新 2:

[self addChildViewController:vc];  
[self.view addSubview:vc.view];
[vc didMoveToParentViewController:self];

当我想解除 vc 时

[vc willMoveToParentViewController:nil];
[vc.view removeFromSuperview];
[vc removeFromParentViewController];

没有导航控制器一切正常

【问题讨论】:

【参考方案1】:

viewController 的 view 的 backgroundColor 不能被清除(就像在堆栈上显示前一个 viewController 的视图一样)。推送或展示一个 viewController 会将新的 viewController 放入堆栈并完全隐藏之前的 viewController。

如果您想在视图上显示清晰的背景颜色,您需要:

1) 将 viewController 设置为前一个 viewController 的 childViewController - 然后自己为过渡设置动画。

或者

2) 将 viewController 逻辑移植到之前的 viewController 中,并让新的 uiview 充当该视图(您还需要自己为过渡设置动画)。

【讨论】:

是的,看起来不错,您需要在 addSubview 之前将 vc.view.frame 设置为适合搜索栏下方,或者在 childViewController 的 didMoveToParentViewController 方法中设置框架。您可能还希望将动画放入 didMoveToParentViewController 中。 @Vadoff 你能引用一个来源吗?这听起来是对的,但我找不到证明或反驳这一点的文档。【参考方案2】:

解决方法如下。举个清晰的例子,我们使用 tableViewController:

UITableViewController *modalVC = [UITableViewController new];
UINavigationController *modalNVC = [[UINavigationController alloc] initWithRootViewController:modalVC];

UIViewController *mainVC = [UIViewController new];
UINavigationController *mainNVC = [[UINavigationController alloc] initWithRootViewController:mainVC];

modalVC.view.backgroundColor = UIColor.clearColor;
mainVC.view.backgroundColor = UIColor.redColor;
mainNVC.modalPresentationStyle = UIModalPresentationCurrentContext;
[mainNVC presentViewController:modalNVC animated:YES completion:NULL];

关键特性是你必须将presentingViewController的modalPresentationStyle设置为UIModalPresentationCurrentContext

它工作正常,但没有幻灯片动画。您将立即获得结果。 但是你仍然可以使用“blood hack”通过连续呈现、关闭和再次呈现来保留视觉动画:

modalVC.view.backgroundColor = UIColor.clearColor;
mainVC.view.backgroundColor = UIColor.redColor;

[mainNVC presentViewController:modalNVC animated:YES completion:^
    [modalNVC dismissViewControllerAnimated:NO completion:^
        mainNVC.modalPresentationStyle = UIModalPresentationCurrentContext;
        [mainNVC presentViewController:modalNVC animated:NO completion:NULL];
    ];
];

【讨论】:

您可以使用modalTransitionStyle设置演示过渡模式,或创建自己的。从长远来看,代码的最后一部分会让您面临问题。 @PeterSuwara 这是克服旧ios版本错误的非常古老的解决方案。现在它可以在没有第二部分的情况下运行良好。【参考方案3】:

你基本上需要告诉导航控制器to:

navigation.modalPresentationStyle = .overCurrentContext

换句话说:

一种将内容显示在另一个视图控制器的内容之上的呈现方式。

就是这样。

您还可以确保:

navigation.view.backgroundColor = .clear

【讨论】:

以上是关于UINavigationController 清除背景色的主要内容,如果未能解决你的问题,请参考以下文章

在 iPhone 和 iPad 上清除视图控制器

将 UISearchController 与 UINavigationController 一起使用

弹出窗口有黑色背景,即使它设置为清除

Popup具有黑色背景,即使它已设置为清除

关闭 UINavigationController 并呈现另一个 UINavigationController

iOS:如何在现有 UINavigationController 中打开另一个 UINavigationController?