UINavigationController - 學習筆記

weixin_34208283發表於2017-03-01

大部分APP都應用了導航控制器(UINavigationController)標籤控制器(UITableBarController)導航欄(UINavigationBar)的設定是非常重要的,系統的導航欄有很大的侷限性,因此很多情況下都會使用自定義導航欄,或者修改系統導航欄。關於導航控制器以及導航的概念,再簡單提一下,一個導航控制器只有一個導航欄。導航控制器可以有很多子檢視控制器,子檢視控制器上的導航欄的Item和標題可以不同,是因為每個子檢視控制器都有一個導航項(UINavigationItem)。在任何子檢視控制器上修改導航欄自身屬性,會改變整個導航控制器的中的導航欄。
在上一篇博文中有提到, 介紹導航控制器的概念

本文主要講解的是基於系統導航欄的自定義使用方法,就是在不隱藏系統導航欄的情況下,修改導航欄的各個屬性。

1.設定背景

建立導航控制器

ViewController *viewCtrl = [[ViewController alloc] init];//預先建立導航控制器的根檢視
UINavigationController *navigationCtrl = [[UINavigationController alloc] initWithRootViewController:viewCtrl];//建立導航控制器
self.window.rootViewController = navigationCtrl;

可以給導航控制器的根檢視設定一個標題。
1469332-46daea32d082e6b0.jpg
系統導航欄演示

系統導航欄預設是這種顏色(跟白色有區別)的,而且帶透明效果,導航欄的字型是黑色的,沒有任何按鈕。 在導航控制器的子檢視中設定

self.navigationController.navigationBar.translucent = NO;//設定導航欄透明度 NO表示不透明
self.navigationController.navigationBar.tintColor = [UIColor greenColor];//改變系統按鈕的線條顏色
self.navigationController.navigationBar.barTintColor = [UIColor yellowColor];//改變導航欄的背景顏色,注意使用.backgroundColor去設定背景顏色,只會有淡淡的一層,跟沒效果一樣
UIBarButtonItem *leftItem1 = [[UIBarButtonItem alloc]initWithBarButtonSystemItem:UIBarButtonSystemItemBookmarks target:self action:@selector(clickAction)];//設定一個系統Item
self.navigationItem.leftBarButtonItem = leftItem1;//新增到導航項的左按鈕
1469332-ac3b210ccc7ca1b5.jpg
更改導航欄的屬性

系統導航欄也是可以設定背景的圖片的

self.navigationController.navigationBar.barStyle = UIBarStyleBlack;
//設定導航欄背景為黑色,標題變成白色 ,目的是讓狀態列字型變成白色

[self.navigationController.navigationBar setBackgroundImage:
[UIImage imageNamed:@"nav_bg_all-64@2x"] forBarMetrics:UIBarMetricsDefault];
//設定導航欄的背景圖片

1469332-eb07f0b75199a700.jpg
設定導航欄背景圖片
導航欄的背景圖片設定完成後,就很像自定義導航欄了,設定狀態列字型顏色 iOS結合導航欄的狀態列字型顏色設定 導航的標題的顏色也變成了白色,是因為設定了UIBarStyleBlack,這個方法雖然用不到它的背景,但是真的很好用,如何設定自定義標題字型會在後面介紹。

2.NavigationItem上的按鈕
@property(nonatomic,copy) NSArray *leftBarButtonItems NS_AVAILABLE_IOS(5_0);
//從導航欄的左到右設定按鈕,如果數量過多會把標題往右移

@property(nonatomic,copy) NSArray *rightBarButtonItems NS_AVAILABLE_IOS(5_0);
//從導航欄的右到左設定按鈕,如果數量過多會把標題往左移

@property(nonatomic,retain) UIBarButtonItem *leftBarButtonItem;
//就是leftBarButtonItems第一個元素

@property(nonatomic,retain) UIBarButtonItem *rightBarButtonItem;
//就是rightBarButtonItems第一個元素

@property(nonatomic,retain) UIBarButtonItem *backBarButtonItem;
//這個是返回按鈕,一般push操作後會自帶的,可以進行pop操作。顯示在最左邊,其實就是leftBarButtonItem。

這些按鈕都是UIBarButtonItem,這個按鈕的初始化方法有很多

UIBarButtonItem *systemItem = [[UIBarButtonItem alloc]initWithBarButtonSystemItem:UIBarButtonSystemItemBookmarks target:self action:@selector(clickAction)];//設定一個系統Item
UIBarButtonItem *imageItem = [[UIBarButtonItem alloc]initWithImage:[UIImage imageNamed:@"11.jpg"] style:UIBarButtonItemStylePlain target:self action:@selector(clickAction)];//帶圖片的按鈕
UIBarButtonItem *titleItem = [[UIBarButtonItem alloc] initWithTitle:@"文字" style:UIBarButtonItemStylePlain target:self action:@selector(clickAction)];//設定一個帶文字的Item
// 設定自定義View,一般設定一個UIButton
UIButton *customButton = [UIButton buttonWithType:UIButtonTypeCustom];
customButton.frame = CGRectMake(0, 0, 25, 25);
[customButton setBackgroundImage:[UIImage imageNamed:@"11.jpg"] forState:UIControlStateNormal];
[customButton addTarget:self action:@selector(clickAction) forControlEvents:UIControlEventTouchUpInside];
UIBarButtonItem *customItem = [[UIBarButtonItem alloc] initWithCustomView:customButton];//把button的檢視交給Item
self.navigationItem.leftBarButtonItems = @[systemItem,imageItem];//新增到導航項的左按鈕
self.navigationItem.rightBarButtonItems = @[titleItem,customItem];//新增到導航項的右按鈕

1469332-a637f7ff7968cdc4.jpg
Item效果圖
那麼來看一下效果: 從左到右 第一個按鈕使用的是UIBarButtonSystemItem,這裡面有很多很多的系統按鈕型別(Xcode裡自己command點進去看看),其實有些還是挺好看的,比如著名的“墨跡天氣”的導航欄中用了兩個系統按鈕。 第二個,好吧,讓我們看下為什麼會變成這個樣子-_-!個人英語水平捉急,並不能很好的理解這個方法。這個方法設定的圖片會按照原圖的大小來設定按鈕,相當過分!過分也算了,圖都沒有!!!不是很推薦這個方法來設定自定義按鈕。 第三個,使用了一個custom view一般都會設定一個按鈕,推薦使用這種,而且大小也是可控的,非常方便。 第四種,直接使用文字作為按鈕,也非常實用。

3.設定標題檢視

第一種方法,設定導航欄標題的字型,大小,顏色,陰影。這個是建立在導航欄上的,而不是導航項,因此整個導航控制器都改變。不能用簡單的navigationBar.title.color這樣區設定,你會發現根本沒有這個屬性。

    //建立屬性的可變字典
    NSMutableDictionary *attributeDict = [NSMutableDictionary dictionaryWithObject:[UIColor greenColor] forKey:NSForegroundColorAttributeName];//新增顏色屬性
    // 向可變字典中新增字型屬性
    [attributeDict setObject:[UIFont italicSystemFontOfSize:18] forKey:NSFontAttributeName];
    NSShadow *shadow = [NSShadow alloc];
    shadow.shadowColor = [UIColor orangeColor];//陰影的顏色
    shadow.shadowOffset = CGSizeMake(2, 2);//陰影的偏移量
    shadow.shadowBlurRadius = 2;//模糊半徑
    // 新增陰影屬性
    [attributeDict setObject:shadow forKey:NSShadowAttributeName];
    // 設定導航欄標題字型屬性,是一個字典
    self.navigationController.navigationBar.titleTextAttributes = attributeDict;
1469332-1cb19677892bdbaa.jpg
自定義導航欄標題字型

可能這個標題看起來有點浮誇- -,只是為了演示效果,大家各取所求。 第二種方法是通過導航項來設定,導航項UINavigationItem有個屬性是titleView。

    UILabel *titleLabel = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 80, 20)];
    titleLabel.text = @"自定義標題檢視";
    self.navigationItem.titleView = titleLabel;//設定標題檢視

該方法設定也很簡單,而且是設定當前子檢視的。比較靈活。

總結一下,一般的導航欄其實不需要隱藏系統導航欄,通過上面幾種方法就可以改變很多屬性,非常實用,希望能給大家帶來幫助。

轉自——iOS系統導航欄的自定義化

相關文章