iOS每个ViewController一个NavigationBar

在日常开发中,我们经常会碰到一些关于导航栏的问题,例如视觉设计,经常性的改变NavigationBar的风格,虽然我们能够在viewwillApper中来进行处理,但是总是太麻烦,而且需要写很多多余的代码,今天就来讲讲这种效果,其实已经有很多APP都是使用这种效果

我们先来看看已经有的一些APP使用的这种效果

这是天猫APP的效果,注意观察他的导航栏

这是网易新闻,注意看导航栏

越来越多的APP采用这种样式来控制导航栏的不同风格,今天我们就来实现这一效果。

这里需要使用到一个第三方库

https://github.com/rickytan/RTRootNavigationController

借助这个库我们能够轻松实现这一效果

新建一个工程,这里我们使用cocoapods来集成这个第三方库

集成RTRootNavigationController

podfile

1
2
3
4
5
6
7
8
9
10
11
12

workspace ‘iOS每个VC单独的一个导航栏.xcworkspace’

project ‘iOS每个VC单独的一个导航栏.xcodeproj’

platform :ios, '8.0'

target 'iOS每个VC单独的一个导航栏' do

pod ‘RTRootNavigationController’

end

使用RTRootNavigationController当做当前的rootController

创建BaseViewController

我这里新建一个BaseViewController 主要是为了引入RTRootNavigationController,当然如果是OC项目的话,可以直接创建一个PCH文件,直接全局引用也行,不过我们一般都会有一个基类的ViewController,在这个基类中,没有做任何操作,只是引用了一个RTRootNavigationController

1
2
3
4
5
#import "RTRootNavigationController.h"

@interface BaseViewController : UIViewController

@end

设置根控制器

在Appdelegate中,我们需要将我们的window的rootcontroller设置为RTRootNavigationController

1
2
3
4
5
6
7
self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
ViewController *viewController = [[ViewController alloc] init];
RTRootNavigationController *rootViewController1 = [[RTRootNavigationController alloc] initWithRootViewController:viewController];
_window.rootViewController = rootViewController1;
_window.backgroundColor = [UIColor whiteColor];
[_window makeKeyAndVisible];
return YES;

在ViewController中,我们需要push出去一个vc的时候,我们需要这样实现

1
2
//注意这里push的时候需要使用rt_navigation push出去
[self.rt_navigationController pushViewController:vc1 animated:YES complete:nil];

看一下效果

设置返回NavigationBar按钮

在当前的vc中,我们设置返回按钮,或者其他的按钮,也很方便

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
 UIButton *btn1 = [UIButton buttonWithType:UIButtonTypeCustom];
[btn1 addTarget:self action:@selector(leftBar1Clicked) forControlEvents:UIControlEventTouchUpInside];
[btn1 setTitle:@"返回1" forState:UIControlStateNormal];
[btn1 setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
[btn1 sizeToFit];
UIBarButtonItem *item1 = [[UIBarButtonItem alloc] initWithCustomView:btn1];

UIButton *btn2 = [UIButton buttonWithType:UIButtonTypeCustom];
[btn2 setTitle:@"返回2" forState:UIControlStateNormal];
[btn2 setTitleColor:[UIColor redColor] forState:UIControlStateNormal];
[btn2 addTarget:self action:@selector(leftBar2Clicked) forControlEvents:UIControlEventTouchUpInside];
[btn2 sizeToFit];
UIBarButtonItem *item2 = [[UIBarButtonItem alloc] initWithCustomView:btn2];

self.navigationItem.leftBarButtonItems = @[item1,item2];

UIButton *btn3 = [UIButton buttonWithType:UIButtonTypeCustom];
[btn3 setTitle:@"右键" forState:UIControlStateNormal];
[btn3 setTitleColor:[UIColor redColor] forState:UIControlStateNormal];
[btn3 addTarget:self action:@selector(rightBarClicked) forControlEvents:UIControlEventTouchUpInside];
[btn3 sizeToFit];
UIBarButtonItem *rightItem = [[UIBarButtonItem alloc] initWithCustomView:btn3];

self.navigationItem.rightBarButtonItem = rightItem;

[self.view addSubview:label];

多个按钮定义也是很方便的

如果只是需要一个左边的返回按钮,这个按钮需要自定义样式,那么可以直接在当前VC冲下方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
/**
如果对于返回事件不需要做任何处理,
但是有想要自定义返回按钮的样式,
可以直接重写这个方法

@param target 监听对象
@param action 返回事件
@return 自定义的返回按钮
*/
-(UIBarButtonItem *)customBackItemWithTarget:(id)target action:(SEL)action{
UIButton *btn = [UIButton buttonWithType:UIButtonTypeCustom];
[btn setTitle:@"返回" forState:UIControlStateNormal];
[btn setTitleColor:[UIColor redColor] forState:UIControlStateNormal];
[btn sizeToFit];
[btn addTarget:target action:action forControlEvents:UIControlEventTouchUpInside];
UIBarButtonItem *item = [[UIBarButtonItem alloc] initWithCustomView:btn];
return item;
}

这样的话,就不要去单独设置左上角的返回按钮了

跳到最开始的VC

在我们pop的时候,可以直接pop在栈顶的VC

1
[self.rt_navigationController popToRootViewControllerAnimated:YES complete:nil];

push到另外一个VC 销毁当前的VC

有时我们想要实现这样一种效果,当当前的VCpush出去过后,希望销毁当前的VC

1
2
3
4
ViewController4 *vc4 = [[ViewController4 alloc] init];
[self.rt_navigationController pushViewController:vc4 animated:vc4 complete:^(BOOL finished) {
[self.rt_navigationController removeViewController:self];
}];

更改导航栏颜色

之前忘记更改导航栏的颜色了,这里看一下,更改导航栏的颜色,只需要

1
self.navigationController.navigationBar.barTintColor = [UIColor greenColor];

总结

如果你的APP在导航栏有多种样式的话,你完全可以使用这种方法,使用起来很方便

感谢:
rickyTan开源
https://github.com/rickytan/RTRootNavigationController

项目的源码我放在了:
https://github.com/yangqian111/blog/tree/master/iOS每个VC单独的一个导航栏