iOS --UINavigationController

常用屬性

  • 設(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)一返回按鈕
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容