如何隐藏旧的UINavigationController并将其替换为另一个?

时间:2013-12-06 11:04:50

标签: ios uinavigationcontroller

第一个viewcontroller (A) 包含一个带有backgroundcolor的普通uinavigationcontroller,然后它会推送一个新的viewcontroller (B) 使用透明的navcontroller。我的第一次尝试是修改 B 中的导航控制器外观,然后当B弹出回到A时反转uinavcontroller的原始颜色。但是当看到导航控制器外观时它似乎搞砸了。我在两个视图之间转换推送和弹出。所以我提出的想法是更换旧的并添加一个完整的全新navcontroller。但是由于某些原因,新的navcontroller从不显示下面的代码?

// Hide the old navigation controller
[self.navigationController setNavigationBarHidden:YES];

// Add a new one
UINavigationController *nav = [[UINavigationController alloc] initWithNavigationBarClass: [TransparentNavBarView class] toolbarClass: [UIToolbar class]];
[nav.navigationItem setLeftBarButtonItems: [self buttonBarItems]];
[nav willMoveToParentViewController: self];
[self.view addSubview: nav.view];
[self addChildViewController: nav];
[nav didMoveToParentViewController:self];

有关我的问题的任何想法?感谢

2 个答案:

答案 0 :(得分:0)

我认为您需要了解导航控制器如何在其下工作 请参阅:UINavigationController

UINavigationController控制ViewControllers的外观。当我们推送一个viewcontroller时,我们实际上将它的视图推送到Navigation Controller的容器视图上。 每个视图控制器的导航栏保持不变。

您可以通过navigationBar访问由导航控制器管理的每个视图控制器中的self.navigationController.navigationBar属性。

来自Apple Docs:

  

允许修改barStyle或半透明属性   导航栏但您必须永远不要更改其框架,边界或   alpha值直接。要显示或隐藏导航栏,您应该   总是通过改变它的导航控制器这样做   navigationBarHidden属性或调用   setNavigationBarHidden:animated:method。

答案 1 :(得分:0)

将此代码用于更改UINavigationBar.backgroundColor。并在viewWillAppear中调用此方法,您希望在其中更改NavigationBar的颜色。

添加此方法:

[[UINavigationBar appearance] setBackgroundImage:[self barBackgroundImage] forBarMetrics:UIBarMetricsDefault];

此视图控制器中的此方法

-(UIImage*)barBackgroundImage{

    static UIImage *defaultImage = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        UIGraphicsBeginImageContextWithOptions(CGSizeMake(20, 44), NO, 0.0f);
        [[UIColor grayColor] setFill];
        [[UIBezierPath bezierPathWithRect:CGRectMake(0, 0, 20, 44)] fill];
        defaultImage = UIGraphicsGetImageFromCurrentImageContext();
        UIGraphicsEndImageContext();

    });

    return defaultImage;

}