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

本文介绍在iOS开发中如何隐藏及自定义导航栏,包括保留返回手势功能、设置导航栏颜色和按钮等,并提供两种实现方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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


通常我们想到的情况是,直接隐藏导航栏,代码如下:
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, width: 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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值