歡迎大家關注我的公眾號,我會定期分享一些我在專案中遇到問題的解決辦法和一些iOS實用的技巧,現階段主要是整理出一些基礎的知識記錄下來
文章也會同步更新到我的部落格:
ppsheep.com
在日常開發中,我們經常會碰到一些關於導航欄的問題,例如視覺設計,經常性的改變NavigationBar的風格,雖然我們能夠在viewwillApper中來進行處理,但是總是太麻煩,而且需要寫很多多餘的程式碼,今天就來講講這種效果,其實已經有很多APP都是使用這種效果
我們先來看看已經有的一些APP使用的這種效果
這是天貓APP的效果,注意觀察他的導航欄
這是網易新聞,注意看導航欄
越來越多的APP採用這種樣式來控制導航欄的不同風格,今天我們就來實現這一效果。
這裡需要使用到一個第三方庫
藉助這個庫我們能夠輕鬆實現這一效果
新建一個工程,這裡我們使用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開源
github.com/rickytan/RT…
專案的原始碼我放在了:
github.com/yangqian111…