iOS每个ViewController一个NavigationBar

 

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

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

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

 

 

 

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

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

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

https://github.com/rickytan/RTRootNavigationController

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

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

集成RTRootNavigationController

podfile

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

#import "RTRootNavigationController.h"          
                      
           @interface BaseViewController : UIViewController          
                      
           @end

设置根控制器

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

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的时候,我们需要这样实现

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

看一下效果

设置返回NavigationBar按钮

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

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冲下方法

/**          
                      如果对于返回事件不需要做任何处理,          
                      但是有想要自定义返回按钮的样式,          
                      可以直接重写这个方法          
                      @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

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

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

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

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

更改导航栏颜色

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

 

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

总结

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