最近開發(fā)項目,在對導(dǎo)航欄barTintColor進(jìn)行設(shè)置時。發(fā)現(xiàn)渲染出來的顏色和美工給的效果圖會出現(xiàn)偏差,去找了一些資料。發(fā)現(xiàn)在iOS7系統(tǒng)以上導(dǎo)航欄多了一個translucent屬性。這個屬性就是設(shè)置導(dǎo)航欄是否具有透明度這個功能。
translucent屬性默認(rèn)是YES,也就是具有透明屬性。所以我們看到的導(dǎo)航欄背景色與美工給的會有很明顯的色差。
有兩種解決方案:
1、取消透明度:
[[UINavigationBar appearance] setTranslucent:NO];
self.navigationController.navigationBar.translucent = NO;
這兩種設(shè)置都可以,一種是全局的,一種是當(dāng)你只需要在某個Controller上處理。
2、設(shè)置背景圖片
[[UINavigationBar appearance] setBackgroundImage:[UIImage imageNamed:@"navbg-ios7"] forBarMetrics:UIBarMetricsDefault]; // 設(shè)置這個會導(dǎo)致搜索框動畫抖動
當(dāng)translucent = YES,controller中self.view的原點是從導(dǎo)航欄左上角開始計算
當(dāng)translucent = NO,controller中self.view的原點是從導(dǎo)航欄左下角開始計算
在translucent = YES的時候,Controller中改變self.view計算原點位置:
self.edgesForExtendedLayout = UIRectEdgeNone; //從navigationBar下面開始計算一直到屏幕tabBar上部
self.edgesForExtendedLayout = UIRectEdgeAll; //從屏幕邊緣計算(默認(rèn))
self.edgesForExtendedLayout = UIRectEdgeTop; //navigationBar下面開始計算一直到屏幕tabBar上部
self.edgesForExtendedLayout = UIRectEdgeBottom; //從navigationBar下面開始計算一直到屏幕底部
在translucent = NO的時候,我試驗設(shè)置self.edgesForExtendedLayout = UIRectEdgeAll;但是是沒有效果的。如果你不想設(shè)置背景圖,又需要self.view從navgationBar左上角為原點,就只能在對應(yīng)的Controller:
self.navigationController.navigationBar.translucent = YES;
設(shè)置這個屬性,然后在viewWillDisappear方法中設(shè)置回NO,這樣就不會影響外面的Controller。
關(guān)于用圖片設(shè)置會導(dǎo)致搜索框抖動的問題,具體我還沒有很好的解決辦法。而且我只是在iOS8系統(tǒng)下會出現(xiàn)抖動。當(dāng)然可以再對應(yīng)Controller上設(shè)置下translucent屬性,但是我沒有實驗過。