nav圖文講解(總結(jié))

  1. 首先是導(dǎo)航控制器下的視圖結(jié)構(gòu)
圖片.png
  • 導(dǎo)航控制器的三個(gè)區(qū):
    導(dǎo)航區(qū):導(dǎo)航控制器的navigationBar,管NSArray<UINavigationItem *> *items;數(shù)組
    內(nèi)容區(qū):用于展示導(dǎo)航控制器字控制器的視圖
    toolbar區(qū):底部工具條,默認(rèn)隱藏

  • 導(dǎo)航條的隱藏和展示:
    通過(guò)navigationBar.translucent = YES/NO調(diào)節(jié)。
    透明情況下:
    內(nèi)容區(qū)從屏幕頂部開(kāi)始, 控制器view的frame為 0 0 screenW screenH(控制器的View的frame相對(duì)于UIViewControllerWrapperView計(jì)算)
    透明情況下,讓控制器的展示區(qū)從導(dǎo)航條底部開(kāi)始:self.edgesForExtendedLayout = UIRectEdgeNone;設(shè)置后,展示區(qū)的高度同樣-64px。同時(shí)automaticallyAdjustsScrollViewInsets失效,scrollView的bounds不自動(dòng)下移。
    測(cè)試:UIViewControllerWrapperView = self.view.superView。更改bounds也可以讓self.view下移64,
    導(dǎo)航條不透明情況下:
    展示區(qū)從導(dǎo)航條下開(kāi)始 。
    導(dǎo)航條不透明情況讓展示區(qū)頂部從屏幕頂部開(kāi)始:self.extendedLayoutIncludesOpaqueBars = YES; 同時(shí)automaticallyAdjustsScrollViewInsets生效。同時(shí)automaticallyAdjustsScrollViewInsets自動(dòng)生效,scrollView的bounds自動(dòng)下移。

    無(wú)論導(dǎo)航條是否透明,UILayoutContainerView、UINavigationTransitionView、UIViewControllerWrapperView都是和屏幕尺寸一致的,變化的只是展示區(qū)域的frame,即子控制器的view的frame。
    測(cè)試:導(dǎo)航控制器下view加載:只要在控制器view不是從頂部0開(kāi)始的情況下,控制器的view的y和height都是不準(zhǔn)確的,當(dāng)子控制器的viewDidAppear的時(shí)候,它的frame是會(huì)被重新定義成展示區(qū)的尺寸。我把展示區(qū)理解成子控制器viewDidAppear后的frame。

  • 導(dǎo)航條透明度的調(diào)節(jié):
    方法一:通過(guò)setBackgroundImage調(diào)節(jié)。
    viewDidLoad、viewWillAppear設(shè)置setBackgroundImage為一張透明度為1.0的圖片話,相當(dāng)于設(shè)置navigationBar.translucent = NO,展示區(qū)下移64px,高度減少64px。
    viewDidAppear設(shè)置setBackgroundImage為一張透明度為1.0的圖片話,相當(dāng)于設(shè)置navigationBar.translucent = NO。但是當(dāng)前控制器不會(huì)顯現(xiàn),展示區(qū)還是0px,高度還是屏幕的尺寸,內(nèi)部的scrollView的bounds還是會(huì)自動(dòng)加64px。pop回上一層控制器后,展示區(qū)下移64px,高度減少64px。如果設(shè)置setBackgroundImage為一張透明度小于1.0的圖片話,就不會(huì)出現(xiàn)navigationBar.translucent狀態(tài)不會(huì)修改。

解決的設(shè)置非透明圖片后,頂欄透明自動(dòng)關(guān)閉的問(wèn)題:
viewDidLoad設(shè)置
[self.navigationController.navigationBar setBackgroundImage:[UIImage imageWithColor:JKRColor(255, 255, 0, 1.0)] forBarMetrics:UIBarMetricsDefault];
self.extendedLayoutIncludesOpaqueBars = YES;

viewWillDisappear設(shè)置
self.navigationController.navigationBar.translucent = YES;

解決設(shè)置完setBackgroundImage為一張非透明圖片之后,展示區(qū)頂部回到0位置:再設(shè)置self.navigationController.navigationBar.translucent = YES;會(huì)回恢復(fù)展示區(qū)y為0的位置,但是設(shè)置的圖片會(huì)自動(dòng)加一些透明度。


1.png

會(huì)出現(xiàn)的問(wèn)題:如果設(shè)置setBackgroundImage同時(shí)設(shè)置barTinkColor,那么圖片透明會(huì)漏出_UIBarBackground的顏色。
如果設(shè)置上一級(jí)的控制器設(shè)置了setBackgroundImage,下一級(jí)的控制器設(shè)置setBackgroundImage圖片為透明色后,底部_UIBarBackground的變?yōu)椴煌该?,漏出黑色,不能穿透顯示底部視圖。


2.png

方法二:通過(guò)修改_UIBarBackground的背景色
圖片.png

首先viewDidLoad中定義當(dāng)前控制器的導(dǎo)航條為非透明狀態(tài),展示區(qū)不自動(dòng)下移。
設(shè)置導(dǎo)航條背景色被透明。
遍歷導(dǎo)航條獲取到_UIBarBackground
根據(jù)透明度設(shè)置其顏色
pop時(shí),即viewWillDisappear時(shí)重新定義導(dǎo)航條為透明

遇到的問(wèn)題:當(dāng)側(cè)滑并返回不POP的時(shí)候,當(dāng)前控制器的導(dǎo)航條的_UIBarBackground背景色雖然透明,但是導(dǎo)航條還是白色,觀察發(fā)現(xiàn),因?yàn)镻OP一半的時(shí)候走了viewWillDisappear并執(zhí)行self.navigationController.navigationBar.translucent = YES;返回的時(shí)候,導(dǎo)致導(dǎo)航條內(nèi)部增加了UIVisualEffectView。我嘗試在viewDidAppear中遍歷出這個(gè)視圖移除,但是沒(méi)有效果。發(fā)現(xiàn)控制器的view加載成功后,再次對(duì)導(dǎo)航條修改必須要等viewDidAppear后一段時(shí)間才可以,沒(méi)有找出來(lái)原因。代碼如下:


815022546DBD4216142B3EF205E5F066.png
907B3330DDA5682F7CB97A1C7F077402.gif

5.導(dǎo)航條下劃線的隱藏:
方法一:設(shè)置navigationBar的clipsToBounds。問(wèn)題:navigationBar為44高度,有背景色的時(shí)候會(huì)發(fā)現(xiàn)問(wèn)題。
方法二:遍歷出下劃線的UIImageView并隱藏。原理:因?yàn)橄聞澗€的高度為0.333,以高度不大于0.4為條件便利導(dǎo)航條的子視圖。

6.Item間距問(wèn)題。
UIBarButtonItem *itemGap = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFixedSpace target:nil action:nil];
itemGap.width = 80;
把間距的item添加到items對(duì)象數(shù)組中要添加間距的兩個(gè)對(duì)象之間即可

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

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

  • *7月8日上午 N:Block :跟一個(gè)函數(shù)塊差不多,會(huì)對(duì)里面所有的內(nèi)容的引用計(jì)數(shù)+1,想要解決就用__block...
    炙冰閱讀 2,717評(píng)論 1 14
  • 廢話不多說(shuō),直接上干貨 ---------------------------------------------...
    小小趙紙農(nóng)閱讀 3,646評(píng)論 0 15
  • 夢(mèng),夢(mèng)的序曲在無(wú)意間奏響,那是一段漫長(zhǎng)的夢(mèng)… 夢(mèng),我做了一個(gè)夢(mèng),每天都做著相同的夢(mèng),一個(gè)永無(wú)止境的夢(mèng),夢(mèng)境幻滅的那...
    羽翼的軌跡閱讀 314評(píng)論 0 1
  • 上午程程拍完復(fù)檢胸片,我們坐在醫(yī)院的走廊里等結(jié)果。眼前是大大小小的腳步來(lái)去匆匆,每個(gè)大人臉上都焦慮不安,許多孩子眼...
    楊榆閱讀 429評(píng)論 2 1
  • 究竟是怎么了?我…… 她手放在木榻上,摸到了那一把艷紅色的長(zhǎng)刀。 像是淬煉時(shí)經(jīng)過(guò)櫻花的點(diǎn)綴,斑駁,妖媚。 刀刃那種...
    亦黎閱讀 401評(píng)論 0 1

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