文章也會同步更新到我的博客:http://ppsheep.com
在日常開發中,我們經常會碰到一些關於導航欄的問題,例如視覺設計,經常性的改變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在導航欄有多種樣式的話,你完全可以使用這種方法,使用起來很方便
感謝:
rickyTan開源
https://github.com/rickytan/RTRootNavigationController
項目的源碼我放在了:
https://github.com/yangqian111/blog/tree/master/iOS每個VC單獨的一個導航欄