不同控制器导航栏显示不同样式

在平时的开发中,我们会遇到一种情况,譬如:(淘宝界面)第一个控制器的导航栏的颜色为 “红色”,第二个导航栏的颜色为“白色”,而且在第二个控制器中利用边缘的返回手势进行滑动还可以返回到第一个控制器中,其实两个控制器不是共用的一个导航条。


通常我们想到的情况是,直接隐藏导航栏,代码如下:
1
2
3
// 错误做法 - 直接隐藏后,后面的控制器都没有导航条了,而且边缘的返回手势也没有了
 self.navigationController.navigationBarHidden = YES;
用上面的方法直接隐藏导航栏显然是不行的,如果直接隐藏那么经过它所 PUSH 出的控制器就都没有导航栏了,而且也返回不到上一控制器了,同时控制器的边缘返回的手势也没了,根本就返回不到上一个控制器了;
 
如果用下面的这种方法也可以隐藏导航栏,而且每个控制器的边缘返回手势也都存在,代码和示例图如下:
1
2
3
// 正确做法 - 隐藏后,边缘的返回手势还在
self.navigationController.navigationBar.hidden = YES;
示例图:(隐藏导航栏后边缘返回手势还存在的示例图
 

 
导航栏是成功的隐藏了,也有边缘手势了,也可以返回到上一个控制器了,但是如何添加 ” 标题“”返回“ 按钮呢?既然上面的方法是将导航栏的 navigationBar 给隐藏了,但是导航栏还是存在的,从哪可以看出来导航栏还在呢,因为 下面这行代码的效果还存在:
1
2
3
4
5
6
7
- (void)pushSecondVC:(UITapGestureRecognizer *)reco {
     
    Class cls = NSClassFromString(@"SecondViewController");
    UIViewController *vc = cls.new;
     
    [self.navigationController pushViewController:vc animated:YES];
}
我们可以利用 navigationBar 再自定义一个就可以了,代码如下:
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#pragma mark - 创建 NavBar
- (void)setupNavBar {
    // 创建 NavBar
    UINavigationBar *bar = [[UINavigationBar alloc] init];
    bar.barTintColor = UIColor.yellowColor;
    [self.view addSubview:bar];
     
    [bar mas_makeConstraints:^(MASConstraintMaker *make) {
        make.top.right.left.equalTo(self.view);
        // 高度为64 包含了状态栏的高度,因为视图的原点是从(0, 0)开始的
        make.height.mas_equalTo(64);
    }];
     
    // 设置标题 - 需要通过 UINavigationItem 来创建
    UINavigationItem *titleItem = [[UINavigationItem alloc] initWithTitle:@"到我啦啦啦啦"];
    bar.items = @[titleItem];
     
    // 设置返回按钮
    titleItem.leftBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"返回" style:UIBarButtonItemStylePlain target:self action:@selector(backPreviousVC)];
}
 
#pragma mark -  返回
- (void)backPreviousVC {
    [self.navigationController popViewControllerAnimated:YES];
}
 
设置完成后的效果图如下:(不同控制器不同导航栏)
 

/******************************************************/

除了上面的方法,还有一种姿势。

navigationController?.navigationBar.setBackgroundImage(UIImage(), for: .default)

navigationController?.navigationBar.shadowImage = UIImage()

然后不同的控制器设置一个frame(0,0,screenWidth,64)的view即可,颜色可以设置在这个view上。

 1     private lazy var bgView:UIView = {
 2         let view = UIView(frame: CGRect(x: 0, y: 0,  UIScreen.main.bounds.width, height: 64))
 3         view.backgroundColor = UIColor.orange
 4         return view
 5     }()
 6     
 7     override func viewDidLoad() {
 8         super.viewDidLoad()
 9         view.insertSubview(bgView, at: 0)
10     }
原文地址:https://www.cnblogs.com/panda1024/p/6388133.html