UINavigationBar 使用總結(jié)

UINavigationBar是我們在開發(fā)過程中經(jīng)常要用到的一個控件判莉,下面我會為大家介紹一些常用的用法豆挽。

1. 設(shè)置導(dǎo)航欄的標(biāo)題

這個不多說,直接上代碼
self.navigationItem.title = @"UINavigationBar使用總結(jié)";

2. 設(shè)置導(dǎo)航欄的背景顏色

//通過barTintColor來設(shè)置背景色
 self.navigationController.navigationBar.barTintColor = [UIColor redColor];```
得到的效果如下:

![Snip20150912_1.png](http://upload-images.jianshu.io/upload_images/452998-97239749e8c4d721.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
> barTintColor: 這個屬性需要在iOS7以上才可以使用; 如果要支持iOS6以及以下的系統(tǒng)券盅,可以參考這篇文章:[UINavigationBar Background Color ](http://www.saturngod.net/articles/uinavigationbar-background-color/)

## 3. 設(shè)置導(dǎo)航欄的背景圖片
除了通過設(shè)置背景顏色來改變導(dǎo)航欄的外觀外帮哈,我們還可以通過背景圖片來設(shè)置導(dǎo)航欄的外觀。

[self.navigationController.navigationBar setBackgroundImage:[UIImage imageNamed:@"Background"]
forBarMetrics:UIBarMetricsDefault];```

Snip20150912_2.png

在這里得稍微說說UIBarMetrics這個枚舉, 它主要是用來控制在不同狀態(tài)下導(dǎo)航欄的顯示锰镀。和UIButton的
- (void)setBackgroundImage:(nullable UIImage *)image forState:(UIControlState)state 這個方法有點類似娘侍。

//表示橫屏豎屏都顯示
UIBarMetricsDefault,
//表示在只橫屏下才顯示,和UIBarMetricsLandscapePhone功效一樣泳炉,不過iOS8已經(jīng)棄用了
UIBarMetricsCompact,
UIBarMetricsDefaultPrompt和UIBarMetricsCompactPrompt這兩個我還沒搞清楚是什么意思憾筏,有知道的朋友不妨給我們來普及一下。花鹅。

4. 更改頂部狀態(tài)欄的顏色

從效果圖可以看出氧腰,我們設(shè)置背景色或者背景圖之后,狀態(tài)欄依然還是默認(rèn)的黑色,這樣感覺不好看古拴。好在箩帚,系統(tǒng)給我們提供了UIStatusBarStyleDefaultUIStatusBarStyleLightContent兩種樣式供我們選擇。

  • UIStatusBarStyleDefault斤富,系統(tǒng)的默認(rèn)樣式膏潮,黑色內(nèi)容锻狗,用于淺色的背景(如白色)
  • UIStatusBarStyleLightContent 白色內(nèi)容满力,用于深色的背景(如紅色)

下面來看看具體怎么實現(xiàn),主流的實現(xiàn)方式是分兩步:

  1. 在工程的Info.plist文件中添加一行UIViewControllerBasedStatusBarAppearance轻纪,選擇Boolean類型油额,并設(shè)置為YES,Xcode會自動把名稱變?yōu)閂iew controller-based status bar appearance刻帚。
    Snip20150913_4.png
  2. 在你的ViewController中添加下面的方法
-(UIStatusBarStyle)preferredStatusBarStyle{
    return UIStatusBarStyleLightContent;
}

想知道更多地方式潦嘶,可以參考這兩個頁面:How to change Status Bar text color in iOS 7iOS7下Status Bar字體顏色修改

另外,特別需要注意的是崇众,如果你的ViewController是通過navigationController push進來的掂僵,還需要加下面一句代碼才能生效:
self.navigationController.navigationBar.barStyle = UIBarStyleBlack;
具體,可參考UIStatusBarStyle PreferredStatusBarStyle does not work on iOS 7

恩顷歌,我們來看看運行效果锰蓬。

Snip20150913_5.png

5. 設(shè)置返回按鈕

從上面的效果圖中我們可以看到返回按鈕還是默認(rèn)的藍(lán)色按鈕,下面我將會大家來介紹返回按鈕的個性化眯漩。

  • 設(shè)置返回按鈕的顏色
    只需要設(shè)置tintColor屬性即可
self.navigationController.navigationBar.tintColor = [UIColor whiteColor];

得到的效果圖如下:


Snip20150915_1.png
  • 只設(shè)置返回按鈕的圖片
- (void)goToBack {
    [self.navigationController popViewControllerAnimated:YES];
}

- (void)setBackButtonWithImage {
    UIImage *leftButtonIcon = [[UIImage imageNamed:@"LeftButton_back_Icon"]
                               imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
    UIBarButtonItem *leftButton = [[UIBarButtonItem alloc] initWithImage:leftButtonIcon
                                                                   style:UIBarButtonItemStyleBordered
                                                                  target:self
                                                                  action:@selector(goToBack)];
    self.navigationItem.leftBarButtonItem = leftButton;
    
    //修復(fù)navigationController側(cè)滑關(guān)閉失效的問題
    self.navigationController.interactivePopGestureRecognizer.delegate = (id)self;
}

得到的效果如下:


Snip20150915_2.png

這里需要注意的地方有三點:

  1. 需要自己實現(xiàn)返回按鈕的事件芹扭。
  2. 特別的解釋下UIImage的imageWithRenderingMode:方法,參數(shù)UIImageRenderingModeAlwaysOriginal 表示總是用原圖渲染赦抖,如果不這么設(shè)置舱卡,返回按鈕將會顯示tintColor的顏色(默認(rèn)為藍(lán)色)。UITabbarItem也存在同樣地問題队萤。
  3. 我們自己設(shè)置返回按鈕轮锥,會導(dǎo)致系統(tǒng)的側(cè)滑關(guān)閉效果失效。添加上面代碼中最后一句代碼即可修復(fù)要尔。
  • 僅設(shè)置返回按鈕的文字
- (void)setBackButtonTitle {
    UIBarButtonItem *leftButton = [[UIBarButtonItem alloc] initWithTitle:NSLocalizedString(@"取消", nil)
                                                                   style:UIBarButtonItemStylePlain
                                                                  target:self action:@selector(goToBack)];
    leftButton.tintColor = [UIColor whiteColor];
    self.navigationItem.leftBarButtonItem = leftButton;
}

得到的效果如下:

Snip20150915_3.png
  • 自定義返回按鈕
    如果上面幾種方式還無法滿足你的要求(比如舍杜,需要同時設(shè)置返回按鈕文字和圖片),就需要用到UIBarButtonIteminitWithCustomView方法盈电。
- (void)setCustomLeftButton {
    UIView* leftButtonView = [[UIView alloc]initWithFrame:CGRectMake(0, 0, 60, 40)];
    UIButton* leftButton = [UIButton buttonWithType:UIButtonTypeSystem];
    leftButton.backgroundColor = [UIColor clearColor];
    leftButton.frame = leftButtonView.frame;
    [leftButton setImage:[UIImage imageNamed:@"LeftButton_back_Icon"] forState:UIControlStateNormal];
    [leftButton setTitle:@"返回" forState:UIControlStateNormal];
    leftButton.tintColor = [UIColor redColor];
    leftButton.autoresizesSubviews = YES;
    leftButton.contentHorizontalAlignment = UIControlContentHorizontalAlignmentLeft;
    leftButton.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleLeftMargin;
    [leftButton addTarget:self action:@selector(goToBack) forControlEvents:UIControlEventTouchUpInside];
    [leftButtonView addSubview:leftButton];
    UIBarButtonItem* leftBarButton = [[UIBarButtonItem alloc] initWithCustomView:leftButtonView];
    self.navigationItem.leftBarButtonItem = leftBarButton;
}

得到的效果圖如下:

Snip20150915_5.png

設(shè)置rightBarButtonItem基本上脫離不了上面的幾種方式蝴簇,大家可以參照上面返回按鈕的設(shè)置方式。

6. 隱藏導(dǎo)航欄底部的線條

有時候遇到一些特殊的要求匆帚,需要隱藏導(dǎo)航欄底部的線條熬词。
兩行代碼就可以做到。

  • 設(shè)置導(dǎo)航欄的背景圖(setBackgroundImage方法)
  • 設(shè)置導(dǎo)航欄的shadowImage (setShadowImage方法)
UINavigationBar *navigationBar = self.navigationController.navigationBar;
    //設(shè)置透明的背景圖,便于識別底部線條有沒有被隱藏
    [navigationBar setBackgroundImage:[[UIImage alloc] init]
                       forBarPosition:UIBarPositionAny
                           barMetrics:UIBarMetricsDefault];
    //此處使底部線條失效
    [navigationBar setShadowImage:[UIImage new]];

來看看效果圖:

Snip20150922_1.png

另外互拾,還有一種做法歪今,一行代碼就可以達(dá)到效果,也真是夠神奇的颜矿。寄猩。

//方法二:
    self.navigationController.navigationBar.clipsToBounds = YES; 

想要知道更詳細(xì)的內(nèi)容可以參考這個頁面:How to hide iOS7 UINavigationBar 1px bottom line

7. 設(shè)置導(dǎo)航條底部線條的顏色

有了上面的基礎(chǔ),設(shè)置導(dǎo)航欄線條的顏色就變得很簡單了骑疆。
首先田篇,我做了個UIImage的分類:通過顏色轉(zhuǎn)成UIImage;
然后箍铭,用上面的方案來設(shè)置導(dǎo)航欄底部線條泊柬。

顏色轉(zhuǎn)圖片的代碼:

@implementation UIImage (ColorImage)

+ (UIImage *)imageWithColor:(UIColor *)color
{
    CGRect rect = CGRectMake(0.0f, 0.0f, 1.0f, 1.0f);
    UIGraphicsBeginImageContext(rect.size);
    CGContextRef context = UIGraphicsGetCurrentContext();
    
    CGContextSetFillColorWithColor(context, [color CGColor]);
    CGContextFillRect(context, rect);
    
    UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    
    return image;
}

@end

設(shè)置導(dǎo)航欄底部線條顏色的代碼:

UINavigationBar *navigationBar = self.navigationController.navigationBar;
    [navigationBar setBackgroundImage:[[UIImage alloc] init]
                       forBarPosition:UIBarPositionAny
                           barMetrics:UIBarMetricsDefault];
    //此處使底部線條顏色為紅色
    [navigationBar setShadowImage:[UIImage imageWithColor:[UIColor redColor]]];

依照慣例,看下效果圖:

Snip20150923_2.png

當(dāng)然還有其他的方式也可以做到诈火,如addSubview, addSubLayer等兽赁。感興趣的話可以參考下這個頁面:iOS7 - Change UINavigationBar border color

8. 在導(dǎo)航欄上添加多個按鈕

以微信打開網(wǎng)頁時的效果為例,效果圖如下冷守,有兩個按鈕:返回和關(guān)閉刀崖。

微信效果圖.png

有下面兩種方式可供選擇,但是最終還是要用到leftBarButtonItems這個方法拍摇。

#define UserMethod1 0
    
    UIBarButtonItem *closeItem = [[UIBarButtonItem alloc] initWithTitle:@"關(guān)閉" style:UIBarButtonItemStylePlain target:self action:@selector(closeAction)];
    if (UserMethod1) {
        //方法一:
        self.navigationItem.leftBarButtonItems = @[closeItem];
        //要求顯示默認(rèn)的返回按鈕亮钦,但是文字會顯示默認(rèn)的Back,暫時還不知道這個文字怎么改
        self.navigationItem.leftItemsSupplementBackButton = YES;
    }
    else {
        //方法二
        UIButton* leftButton = [UIButton buttonWithType:UIButtonTypeSystem];
        leftButton.backgroundColor = [UIColor clearColor];
        leftButton.frame = CGRectMake(0, 0, 45, 40);
        [leftButton setImage:[UIImage imageNamed:@"LeftButton_back_Icon"] forState:UIControlStateNormal];
        [leftButton setTitle:@"返回" forState:UIControlStateNormal];
        leftButton.tintColor = [UIColor whiteColor];
        leftButton.autoresizesSubviews = YES;
        leftButton.contentHorizontalAlignment = UIControlContentHorizontalAlignmentLeft;
        leftButton.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleLeftMargin;
        [leftButton addTarget:self action:@selector(goToBack) forControlEvents:UIControlEventTouchUpInside];
        UIBarButtonItem* backItem = [[UIBarButtonItem alloc] initWithCustomView:leftButton];
        
        self.navigationItem.leftBarButtonItems = @[backItem,closeItem];
    }

然后授翻,運行的效果圖如下:

在導(dǎo)航欄上添加多個按鈕.png

方法一用到了leftItemsSupplementBackButton 這個屬性或悲,會顯示系統(tǒng)默認(rèn)的返回按鈕,但是文字也是顯示默認(rèn)的Back文字堪唐,目前還沒找到怎么修改這個文字巡语,如果有誰知道,還請不吝賜教淮菠;所以我暫時還是建議大家用方法二男公。相應(yīng)的還有 rightBarButtonItems 這個屬性,如果要在導(dǎo)航欄右側(cè)展示多個按鈕的話合陵,可以設(shè)置這個屬性枢赔。

9. 在導(dǎo)航欄上添加分段控件

這次,以QQ為例拥知,代碼如下:

UISegmentedControl *segControl = [[UISegmentedControl alloc] initWithItems:@[@"消息",@"電話"]];
    segControl.tintColor = [UIColor colorWithRed:0.07 green:0.72 blue:0.96 alpha:1];
    [segControl setSelectedSegmentIndex:0];
    self.navigationItem.titleView = segControl;

代碼很簡單踏拜,就是設(shè)置titleView這個屬性,當(dāng)然低剔,你也可以把這個屬性設(shè)置為你自定義的View速梗。

類似于QQ的導(dǎo)航欄.png

10. 導(dǎo)航欄全局屬性設(shè)置

//全局設(shè)置導(dǎo)航欄主題
- (void)setNavigationControllerAppearance {
    [UINavigationBar appearance].barStyle  = UIBarStyleBlack;
    [[UINavigationBar appearance] setBarTintColor:[UIColor colorWithWhite:0.1 alpha:0.5]];
    [[UINavigationBar appearance] setTintColor:[UIColor whiteColor]];
}

全局設(shè)置導(dǎo)航欄的好處有兩個:一是不用對每個NavigationBar進行設(shè)置肮塞;二是方便做主題管理,切換主題姻锁,只需要更改全局設(shè)置即可枕赵。

11. 與導(dǎo)航欄相關(guān)的一些開源組件

11.1 NJKWebViewProgress - 類似于Safiri加載網(wǎng)頁時的進度顯示

網(wǎng)頁加載進度.png
網(wǎng)頁加載進度.png

11.2 FDFullscreenPopGesture - 一個絲滑的全屏滑動返回手勢

對應(yīng)的文章介紹可以點這個鏈接

絲滑的全屏返回手勢.png
絲滑的全屏返回手勢.png

最后位隶,奉上Demo的地址:NavigationBarDemo

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末拷窜,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子涧黄,更是在濱河造成了極大的恐慌篮昧,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,839評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異倒庵,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評論 2 382
  • 文/潘曉璐 我一進店門既峡,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人珠插,你說我怎么就攤上這事奴迅。” “怎么了均抽?”我有些...
    開封第一講書人閱讀 153,116評論 0 344
  • 文/不壞的土叔 我叫張陵嫁赏,是天一觀的道長。 經(jīng)常有香客問我油挥,道長潦蝇,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,371評論 1 279
  • 正文 為了忘掉前任深寥,我火速辦了婚禮攘乒,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘惋鹅。我一直安慰自己则酝,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 64,384評論 5 374
  • 文/花漫 我一把揭開白布闰集。 她就那樣靜靜地躺著沽讹,像睡著了一般。 火紅的嫁衣襯著肌膚如雪武鲁。 梳的紋絲不亂的頭發(fā)上爽雄,一...
    開封第一講書人閱讀 49,111評論 1 285
  • 那天,我揣著相機與錄音沐鼠,去河邊找鬼挚瘟。 笑死蝇率,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的刽沾。 我是一名探鬼主播本慕,決...
    沈念sama閱讀 38,416評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼侧漓!你這毒婦竟也來了锅尘?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,053評論 0 259
  • 序言:老撾萬榮一對情侶失蹤布蔗,失蹤者是張志新(化名)和其女友劉穎藤违,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體纵揍,經(jīng)...
    沈念sama閱讀 43,558評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡顿乒,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,007評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了泽谨。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片璧榄。...
    茶點故事閱讀 38,117評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖吧雹,靈堂內(nèi)的尸體忽然破棺而出骨杂,到底是詐尸還是另有隱情,我是刑警寧澤雄卷,帶...
    沈念sama閱讀 33,756評論 4 324
  • 正文 年R本政府宣布搓蚪,位于F島的核電站,受9級特大地震影響丁鹉,放射性物質(zhì)發(fā)生泄漏妒潭。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,324評論 3 307
  • 文/蒙蒙 一揣钦、第九天 我趴在偏房一處隱蔽的房頂上張望雳灾。 院中可真熱鬧,春花似錦拂盯、人聲如沸佑女。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,315評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽团驱。三九已至,卻和暖如春空凸,著一層夾襖步出監(jiān)牢的瞬間嚎花,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,539評論 1 262
  • 我被黑心中介騙來泰國打工呀洲, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留紊选,地道東北人啼止。 一個月前我還...
    沈念sama閱讀 45,578評論 2 355
  • 正文 我出身青樓,卻偏偏與公主長得像兵罢,于是被迫代替她去往敵國和親献烦。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,877評論 2 345

推薦閱讀更多精彩內(nèi)容

  • UINavigationBar是我們在開發(fā)過程中經(jīng)常要用到的一個控件卖词,下面我會為大家介紹一些常用的用法巩那。 1. 設(shè)...
    橙娃閱讀 686評論 0 1
  • UINavigationBar是我們在開發(fā)過程中經(jīng)常要用到的一個控件,下面是UINavigationBar一些常用...
    YHWXQ簡簡單單的生活閱讀 1,439評論 0 4
  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫此蜈、插件即横、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,029評論 4 62
  • #1. 都說,食色性也 裆赵,這真的是再恰當(dāng)不過了东囚。這世間唯有食物與愛不可辜負(fù),愛給你甜蜜战授,但是味蕾卻給人莫大的滿足感...
    鹿大嬸閱讀 695評論 3 6
  • 今天看到幾句話页藻,挺有意思,這位作者的思想想必也是有自己的想法的陈醒。 如果下輩子我還記得你惕橙,那是這輩子...
    O田二爺O閱讀 142評論 0 0