一、簡介
iOS中以棧的形式保存子控制器,如下圖

nav棧.png
導(dǎo)航控制顯示的永遠(yuǎn)是我們棧頂控制器的view
二、 簡單使用
簡單的創(chuàng)建方式
UIViewController*vc = [[UIViewControlleralloc] init];UINavigationController*nav = [[UINavigationControlleralloc] initWithRootViewController:vc];self.window.rootViewController = nav;
三、底層實現(xiàn)
這里講一下 navigation 底層的實現(xiàn)邏輯,其實就是解釋這行代碼的邏輯:
UINavigationController *nav =[[UINavigationController alloc]initWithRootViewController:vc];
底層系統(tǒng)默認(rèn)的調(diào)用了push方法將我們的vc設(shè)置成為棧底跟視圖。
四、層次結(jié)構(gòu)
我們來看看 navigationcontroller 的層次結(jié)構(gòu)
當(dāng)我們將一個控制器裝入一個 navigationcontroller 并設(shè)為跟控制器之后,就會看到層次中多了一個 UILayoutContainerView 中包含了連個視圖,一個是UINavigationTransitionView、一個是UINavigationBar視圖。UINavigationTransitionView 裝載的就是當(dāng)前棧頂控制器所承載的視圖,UINavigationBar 就是我們的導(dǎo)航欄視圖。

nav1.png

nav2.png

nav3.png
五、注意事項
前方高能:automaticallyAdjustsScrollViewInsets這個屬性默認(rèn)將controller上所有的scrollView都向下偏移64,由于筆者被其所坑,找了三天bug才找出它來,所以一定要慎用此屬性。
在iOS7之后,系統(tǒng)默認(rèn)會給導(dǎo)航控制器中所有的UIScrollVIew的頂部添加額外的滾動區(qū)域64,消除方法:
self.automaticallyAdjustsScrollViewInsets =NO;
設(shè)置導(dǎo)航條透明方法:其實是設(shè)置導(dǎo)航條內(nèi)的背景圖片的顏色是透明的
[self.navigationController.navigationBar setBackgroundImage:[[UIImage alloc] init] forBarMetrics:UIBarMetricsDefault];
設(shè)置導(dǎo)航條陰影背景,也是設(shè)置圖片:
[self.navigationController.navigationBar setShadowImage:[[UIImage alloc] init]];