最近又趟了個坑竹伸,做了個頁面泥栖,大概長下面這樣,在主程序的堆棧里好好的勋篓,在一個新present出來的堆棧里吧享,就成了圖2的樣子。
先不說上面空出來一塊的問題譬嚣,頂部這個白色刺眼的navigationBar钢颂,很明顯是navigationBar的背景顏色成了白色,可我并沒有設置過顏色啊拜银。em…先來看看視圖層級殊鞭,發(fā)現(xiàn)navigationBar的subview里有一個純白色的_UIBarBackground類型的view遭垛,看class就知道是蘋果內(nèi)部的API,網(wǎng)上查了查操灿,還真有人說同樣的問題锯仪,配合出現(xiàn)的還有一個屬性:translucent,好了趾盐,開始查文檔庶喜。
translucent,文檔里大概這么寫的救鲤,如果把translucent設為NO久窟,則navigationBar的背景不管設置了什么背景圖,navigationBar都會變成完全不透明的(毛玻璃本缠、半透明背景都會有影響)斥扛,我的navigationBar就是不透明的,這個屬性必須是NO丹锹。嗯稀颁,設置好參數(shù)和背景顏色,運行卷仑,navigationBar還還還還還是白的峻村。。
哪里出問題了呢锡凝?文檔里提到會對背景"圖"有影響粘昨,看來背景顏色出了問題他不管?好吧窜锯,我用這個顏色生成了一張image张肾,當做背景圖片,還真好了锚扎。問題解決~
[self.navigationController.navigationBar setBackgroundImage:[UIImage imageWithColor:[UIColor colorWithHexString:@"#3B3B3B"]] forBarMetrics:UIBarMetricsDefault];
只研究到這兒肯定不是我的性格吞瞪,試了下用一個半透明的顏色生成圖片做背景,就可以得到一個半透明背景的navigationBar驾孔。創(chuàng)建一個UIVisualEffectView塞到navigationBar上芍秆,也可以得到一個毛玻璃的navigationBar已亥。其實根本沒有設置translucent吼畏,文檔里也說如果開發(fā)者沒有設置,UIKit會根據(jù)設置背景圖的不同查牌,自動推斷translucent的值对碌。研究到這里好像跟_UIBarBackground荆虱,translucent都沒什么關系了。總結就一句話:不要用backgroundColor來改變navigationBar的背景顏色,用backgroundImage怀读。THE END
再附帶上兩個其他的坑:
1诉位,篇頭提到的view整體偏移的問題,用到了這么個屬性
self.extendedLayoutIncludesOpaqueBars = YES;
2菜枷,后來開發(fā)中又遇到了navigationBar整體隱藏的問題苍糠,寫代碼怎么也顯示不出來,原因是最開始創(chuàng)建navigationController的時候調用了這么一句
navigationController.navigationBar.hidden = YES;
換成這樣就好了
[navigationController setNavigationBarHidden:YES animated:NO];
剛開始查問題的時候看到網(wǎng)上幾篇博文在講怎么把這個_UIBarBackground隱藏掉犁跪,個人不建議這么做椿息,既然蘋果沒有把他暴露出來,你就不確定他的navigationBar會不會還有別的層級坷衍,建議盡量還是用蘋果原生的API來解決問題,這也是我寫這篇文章的原因条舔。
UIKit說到底還是一個底層架構枫耳,從最早的iOS適配到現(xiàn)在的iOS12,說里面有坑我是相信的孟抗,但我也相信蘋果在發(fā)布前肯定做過嚴格的測試迁杨。如果真的真的遇到原生API解決不了的問題,我猜大部分出在產(chǎn)品需求上吧[偷笑]凄硼。好了铅协,今天到這結束,END