常用屬性
- 設(shè)置navigationItem的titleView
- initWithImage:初始化UIImageView -》 根據(jù)圖片大小尺寸填充

Snip20150901_16.png
- navigationItem的多個圖標(biāo)的設(shè)置

Snip20150901_41.png
- 通過添加View(包含兩個按鈕),這樣設(shè)置太麻煩還需要控制控件的位置與尺寸
- 系統(tǒng)自帶導(dǎo)航右邊視圖,可以存放控件的集

Snip20150901_39.png
1、原理分析
- initWithRootViewController底層
- 會調(diào)用push方法
- initWithRootViewController底層其實是調(diào)用導(dǎo)航控制器的push方法,把vc成為導(dǎo)航控制器的子控制器
- 一旦把一個控制器壓入到棧,就會把這個控制器的view添加到導(dǎo)航控制器的view上
// 創(chuàng)建導(dǎo)航控制器
// 導(dǎo)航控制器必須要有一個根控制器
UINavigationController *nav = [[UINavigationController alloc] initWithRootViewController:vc];
2、常識
- 導(dǎo)航控制器永遠(yuǎn)顯示的是棧頂控制器的view
- 導(dǎo)航控制器中做界面之間的跳轉(zhuǎn)必須拿到導(dǎo)航控制器
- 調(diào)用pop方法并不會馬上銷毀當(dāng)前控制器
[self.navigationController popViewControllerAnimated:YES];
- 在iOS7之后,默認(rèn)會把導(dǎo)航條上的按鈕的圖片渲染成藍(lán)色.
- 圖片不渲染: imageWithRenderingMode:
```objc
// 不想要渲染導(dǎo)航條上的按鈕的圖片顏色
UIImage *image = [UIImage imageNamed:@"navigationbar_friendsearch"];
// 告訴蘋果哪個圖片不要渲染
image = [image imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
- 導(dǎo)航條上的子控件位置不需要我們管理,只需要管理尺寸
- 以后只要看到item,通常都是蘋果提供的模型,只要改模型就能修改蘋果的某些控件.
- UINavigationItem:是一個模型,決定導(dǎo)航條的內(nèi)容(左邊內(nèi)容,中間,右邊內(nèi)容)
- UIBarButtonItem:是一個模型,決定導(dǎo)航條上按鈕的內(nèi)容
3、自定義導(dǎo)航欄
什么時候需要自定義導(dǎo)航欄,繼承UINavigationBar
- 當(dāng)系統(tǒng)自帶的導(dǎo)航欄不滿足我們的需要的時候
- 案例一:統(tǒng)一設(shè)置導(dǎo)航欄 左右按鈕 偏移量距離屏幕
方案一:自定義左右導(dǎo)航欄按鈕,判斷如果是左右按鈕,然后修改左右按鈕的frame
方案二:通過frame判斷,導(dǎo)航欄左右按鈕,然后修改左右按鈕的frame
- 自定義導(dǎo)航欄,必須自定義導(dǎo)航控制器,然后利用KVC方式替換掉系統(tǒng)的,替換成我們自己的導(dǎo)航欄
- 1 自定義導(dǎo)航控制器 JPNavigationController,繼承UINavigationController。
- 2 KVO 替換系統(tǒng)導(dǎo)航欄
- (void)viewDidLoad
{
[super viewDidLoad];
// 替換為自定義的導(dǎo)航欄
[self setValue:[[JPNavigationBar alloc] init] forKeyPath:@"navigationBar"];
}
4、自定義導(dǎo)航控制器
什么時候需要自定義導(dǎo)航控制器,有哪些情況?
- 1 若自定義導(dǎo)航欄,KVC方式替換導(dǎo)航欄
- 2 需要修改UINavigationBar / UIBarButtonItem主題時,需要自定義導(dǎo)航控制器,然后在initialize統(tǒng)一初始化樣式
- 3 如下需求:就需要重寫導(dǎo)航控制器的push方法實現(xiàn),就需要自定義導(dǎo)航控制器實現(xiàn)。
- 導(dǎo)航控制器子控制器(非根VC)的 tabBar隱藏
- 導(dǎo)航控制器子控制器(非根VC)的 統(tǒng)一返回按鈕