iOS每個ViewController一個NavigationBar

ppsheep發表於2019-03-03

歡迎大家關注我的公眾號,我會定期分享一些我在專案中遇到問題的解決辦法和一些iOS實用的技巧,現階段主要是整理出一些基礎的知識記錄下來

iOS每個ViewController一個NavigationBar

文章也會同步更新到我的部落格:
ppsheep.com

在日常開發中,我們經常會碰到一些關於導航欄的問題,例如視覺設計,經常性的改變NavigationBar的風格,雖然我們能夠在viewwillApper中來進行處理,但是總是太麻煩,而且需要寫很多多餘的程式碼,今天就來講講這種效果,其實已經有很多APP都是使用這種效果

我們先來看看已經有的一些APP使用的這種效果

這是天貓APP的效果,注意觀察他的導航欄

iOS每個ViewController一個NavigationBar

這是網易新聞,注意看導航欄

iOS每個ViewController一個NavigationBar

越來越多的APP採用這種樣式來控制導航欄的不同風格,今天我們就來實現這一效果。

這裡需要使用到一個第三方庫

github.com/rickytan/RT…

藉助這個庫我們能夠輕鬆實現這一效果

新建一個工程,這裡我們使用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];複製程式碼

看一下效果

iOS每個ViewController一個NavigationBar

設定返回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];複製程式碼

iOS每個ViewController一個NavigationBar

多個按鈕定義也是很方便的

如果只是需要一個左邊的返回按鈕,這個按鈕需要自定義樣式,那麼可以直接在當前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;
}複製程式碼

這樣的話,就不要去單獨設定左上角的返回按鈕了

iOS每個ViewController一個NavigationBar

跳到最開始的VC

在我們pop的時候,可以直接pop在棧頂的VC

[self.rt_navigationController popToRootViewControllerAnimated:YES complete:nil];複製程式碼

iOS每個ViewController一個NavigationBar

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];
 }];複製程式碼

iOS每個ViewController一個NavigationBar

更改導航欄顏色

之前忘記更改導航欄的顏色了,這裡看一下,更改導航欄的顏色,只需要

self.navigationController.navigationBar.barTintColor = [UIColor greenColor];複製程式碼

iOS每個ViewController一個NavigationBar

總結

如果你的APP在導航欄有多種樣式的話,你完全可以使用這種方法,使用起來很方便

感謝:
rickyTan開源
github.com/rickytan/RT…

專案的原始碼我放在了:
github.com/yangqian111…

相關文章