你好,歡迎來到IOS教程網

 Ios教程網 >> IOS編程開發 >> IOS開發基礎 >> iOS每個ViewController一個NavigationBar

iOS每個ViewController一個NavigationBar

編輯:IOS開發基礎

文章也會同步更新到我的博客:http://ppsheep.com

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

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

006tNc79jw1f9v3ayb8i1g30b00jmx6t.gif

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

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

006tNc79jw1f9v3baszhug30b00jmkjn.gif

越來越多的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];

看一下效果

L89Z6fk.gif

設置返回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];

006tNc79jw1f9v3ghsse0j30cr0lhq38.jpg

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

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

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

2.gif

跳到最開始的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];
 }];

3.gif

更改導航欄顏色

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

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

4.gif

總結

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

感謝:

rickyTan開源

https://github.com/rickytan/RTRootNavigationController

項目的源碼我放在了:

https://github.com/yangqian111/blog/tree/master/iOS每個VC單獨的一個導航欄


  1. 上一頁:
  2. 下一頁:
蘋果刷機越獄教程| IOS教程問題解答| IOS技巧綜合| IOS7技巧| IOS8教程
Copyright © Ios教程網 All Rights Reserved