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 清除背景色的主要内容,如果未能解决你的问题,请参考以下文章
将 UISearchController 与 UINavigationController 一起使用
关闭 UINavigationController 并呈现另一个 UINavigationController
iOS:如何在现有 UINavigationController 中打开另一个 UINavigationController?