【问题标题】:UINavigationController clear background colorUINavigationController 清除背景色
【发布时间】: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];

没有导航控制器一切正常

【问题讨论】:

    标签: ios uiviewcontroller uinavigationcontroller


    【解决方案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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-11-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多