前言:經(jīng)常遇到這樣的需求:從有導(dǎo)航欄的界面跳轉(zhuǎn)到導(dǎo)航欄透明的界面,由于iOS從有導(dǎo)航欄跳轉(zhuǎn)到透明導(dǎo)航欄界面,并且設(shè)置hideBottomWhenPush屬性會(huì)有bug,即導(dǎo)航欄會(huì)有黑影。我采取將導(dǎo)航欄控制的navigationbar進(jìn)行隱藏,自己在viewcontroller添加一個(gè)navigationbar以實(shí)現(xiàn)需求。過程中沒有理解清楚navigationbar和navigationItem,這里簡(jiǎn)單記錄一下。
NavigationBar
The navigation bar displays information from a stack of UINavigationItem objects. At any given time, the UINavigationItem that is currently the topItem of the stack determines the title and other optional information in the navigation bar, such as the right button and prompt.
翻譯:navigationbar 展示通過一個(gè)棧對(duì)象navgationItem來展示信息,棧頂?shù)膎avgationItem對(duì)象決定著導(dǎo)航標(biāo)題和其他信息,例如導(dǎo)航欄右邊提示按鈕。
這里可以得知如果想管理navigationbar上面的左右按鈕,標(biāo)題信息,則需要?jiǎng)?chuàng)建一個(gè)navigationItem對(duì)象,對(duì)navigationItem進(jìn)行設(shè)置后再push,pop等操作進(jìn)入到navigationbar的棧中。而如果管理樣式,則通過屬性控制或者修改子控件。navigationbar的層級(jí)結(jié)構(gòu)如下:


結(jié)構(gòu)中看出:
默認(rèn)navigationbar高度為44點(diǎn),但navigationbar的View卻有84點(diǎn)的高度,iOS7以后對(duì)背景進(jìn)行了延伸。View中有背景圖View、底部線條View還有圖中紅色框部分的按鈕等控件。設(shè)置導(dǎo)航欄透明經(jīng)常對(duì)背景圖與底部線條設(shè)置為透明的圖片。
navigationController下默認(rèn)有一個(gè)navigationBar,這是navigationController管理下所有viewcontroller共用的。對(duì)于某個(gè)頁面設(shè)置導(dǎo)航欄透明,滑動(dòng)漸變效果,可以讓navigationController的隱藏掉,自己給每個(gè)viewcontroller增加一個(gè)navigationBar,對(duì)這個(gè)navigationBar進(jìn)行處理。退出界面后將導(dǎo)航欄恢復(fù)顯示。這個(gè)方案也是上面推薦鏈接一個(gè)方案之一。這樣可以避免一些因?yàn)樵O(shè)置導(dǎo)航欄透明,在界面中跳轉(zhuǎn)帶來的系統(tǒng)bug。
NavigationItem

NavigationItem是UIViewController的屬性,這也是導(dǎo)航器管理下的viewcontroller中進(jìn)行設(shè)置的原因:
self.navigationItem.title = @"title";
而不是
self.navigationController.navigationItem.title = @"title";
思考了一下navigationItem為什么是viewcontroller的屬性,而不是navigationbar的屬性呢?因?yàn)閚avigationbar是棧的方式管理navigationItem。navigationcontroller每次push或者pop一個(gè)viewcontroller,其實(shí)也執(zhí)行了對(duì)navigationbar執(zhí)行了push or pop item。這樣每個(gè)viewcontroller擁有自己的navigationItem,則可以訂制自己的頁面導(dǎo)航欄。