iOS-導(dǎo)航欄背景色和透明度探究

首先,我們來看看通過以下設(shè)置將會對導(dǎo)航欄產(chǎn)生什么影響

1.設(shè)置背景色--backgroundColor

 UINavigationBar * bar = self.navigationController.navigationBar;
bar.backgroundColor = [UIColor redColor];
Snip20160819_1.png

效果:不透明,不是我們想要的純紅色

Snip20160819_3.png

UINavigationBar被設(shè)置為純紅色.

分析:

整個導(dǎo)航欄看上去之所以呈現(xiàn)淡紅色,是因為上面還有幾層遮蓋,且遮蓋并非cleancolor,效果疊加,所以顯示出來不為純紅色.還有一點值得注意,導(dǎo)航欄下面顏色深,而上面一部分顏色較淺,這是因為UINavigationBar高度為44,而其上面的View的高度為64.

2.設(shè)置背景圖片--BackgroundImage

  • 首先封裝了一個方法,用來生成背景圖片

- (UIImage *) imageWithFrame:(CGRect)frame alphe:(CGFloat)alphe {
    frame = CGRectMake(0, 0, frame.size.width, frame.size.height);
   UIColor *redColor = [UIColor colorWithRed:1 green:0 blue:0 alpha:alphe];
    UIGraphicsBeginImageContext(frame.size);
    CGContextRef context = UIGraphicsGetCurrentContext();
    CGContextSetFillColorWithColor(context, [redColor CGColor]);
    CGContextFillRect(context, frame);
    UIImage *theImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    return theImage;
}
  • 設(shè)置背景圖片(這里alpha=1.0)
 UINavigationBar * bar = self.navigationController.navigationBar;
    UIImage *bgImage = [self imageWithFrame:CGRectMake(0, 0, [UIScreen mainScreen].bounds.size.width, 64) alphe:1.0];
    [bar setBackgroundImage:bgImage forBarMetrics:UIBarMetricsDefault];

Snip20160819_4.png

半透明紅色,上下顏色均勻
Snip20160819_5.png

UINavigationBarBackground被設(shè)置為紅色,與設(shè)置backgroundColor相比少了兩層View

  • 在這里圖片的alpha值需要注意:無論圖片alpha值是否等于1,都會有半透明效果,值越大不透明度越高,但是不可能變成完全不透明.(按理來說,我們設(shè)置的圖片alpha=1.0,應(yīng)該是不透明才對,但是這里仍然半透明,這一點在后面會解釋)

3. 設(shè)置barTintColor

 UINavigationBar * bar = self.navigationController.navigationBar;
 bar.barTintColor = [UIColor redColor];

Snip20160819_8.png

均勻,不透明純紅色
Snip20160819_10.png

最上面一層View變?yōu)榧t色

4. translucent屬性

  • 該屬性用來確定navigation bar背景是否為半透明.如果設(shè)置該屬性為NO,那么就不會有上面半透明的效果.
Snip20160819_17.png
  • 上面三種方式下,都設(shè)置translucent = NO,那么都不再有半透明效果.值得注意的是,當(dāng)設(shè)置的是backgroundColor為紅色時,如果設(shè)置translucent = NO,得到的是不透明的白色效果,而不是紅色.這時因為設(shè)置backgroundColor影響的是下面的UINavigationBar,而translucent = NO影響的是處于上面的UINavigationBarBackground,此時UINavigationBarBackground為不透明白色,下面的紅色也就看不到了.


    Snip20160819_21.png

為什么會出現(xiàn)上面的效果呢?

  • 我們先來看看官方文檔對translucent的解釋
 New behavior on iOS 7.
 Default is YES.
 You may force an opaque background by setting the property to NO.
 If the navigation bar has a custom background image, the default is inferred
 from the alpha values of the image—YES if it has any pixel with alpha < 1.0
 If you send setTranslucent:YES to a bar with an opaque custom background image
 it will apply a system opacity less than 1.0 to the image.
 If you send setTranslucent:NO to a bar with a translucent custom background image
 it will provide an opaque background for the image using the bar's barTintColor if defined, or black
 for UIBarStyleBlack or white for UIBarStyleDefault if barTintColor is nil.
 Default is NO on iOS 6 and earlier. Always YES if barStyle is set to UIBarStyleBlackTranslucent
  • 下面是個人對上面內(nèi)容的總結(jié)
  • 1.iOS 6.0及以前,默認(rèn)NO(不透明),iOS7.0開始默認(rèn)YES(半透明).如果barStyle設(shè)置為UIBarStyleBlackTranslucent,總是Yes
  • 2.能夠通過設(shè)置該屬性為NO,強制改變背景為不透明
  • 3.如果navigation bar有設(shè)置自定義的背景圖片,那么默認(rèn)值將根據(jù)該背景圖片的alpha值而定,如果圖片alpha值為1.0,那么默認(rèn)值為YES
  • 4.如果navigation bar擁有一個自定義不透明的背景圖片,再設(shè)置setTranslucent = YES,那么該背景圖片將采用系統(tǒng)不透明的alpha值(<1.0)
  • 5.如果navigation bar擁有一個自定義半透明的背景圖片,再設(shè)置translucent = NO,那么得到不透明效果. 如果設(shè)置了barTintColor,那么相當(dāng)于通過設(shè)置barTintColor來完成.如果沒有設(shè)置barTintColor,那么就是通過設(shè)置barStyle完成.黑色(UIBarStyleBlack),或者白色(UIBarStyleDefault)
  • 從第3和第4點,就能理解為什么設(shè)置背景圖片alpha=1.0,得到的卻還是半透明效果.
  • 第5點可以解釋,為什么設(shè)置backgroundColor后再設(shè)置translucent = NO得到不透明的白色效果.因為默認(rèn)barStyle = UIBarStyleDefault.如果設(shè)置barStyle = UIBarStyleDefault,的到的就是黑色效果.
Snip20160819_22.png
  • 總的來說,只要是translucent = NO,得到的就一定是不透明效果.在translucent = YES時,設(shè)置barTintColor也能得到不透明效果.
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子肮韧,更是在濱河造成了極大的恐慌,老刑警劉巖然走,帶你破解...
    沈念sama閱讀 218,122評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異戏挡,居然都是意外死亡芍瑞,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,070評論 3 395
  • 文/潘曉璐 我一進(jìn)店門褐墅,熙熙樓的掌柜王于貴愁眉苦臉地迎上來拆檬,“玉大人洪己,你說我怎么就攤上這事≈绕停” “怎么了码泛?”我有些...
    開封第一講書人閱讀 164,491評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長澄耍。 經(jīng)常有香客問我噪珊,道長,這世上最難降的妖魔是什么齐莲? 我笑而不...
    開封第一講書人閱讀 58,636評論 1 293
  • 正文 為了忘掉前任痢站,我火速辦了婚禮,結(jié)果婚禮上选酗,老公的妹妹穿的比我還像新娘阵难。我一直安慰自己,他們只是感情好芒填,可當(dāng)我...
    茶點故事閱讀 67,676評論 6 392
  • 文/花漫 我一把揭開白布呜叫。 她就那樣靜靜地躺著,像睡著了一般殿衰。 火紅的嫁衣襯著肌膚如雪朱庆。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,541評論 1 305
  • 那天闷祥,我揣著相機與錄音娱颊,去河邊找鬼。 笑死凯砍,一個胖子當(dāng)著我的面吹牛箱硕,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播悟衩,決...
    沈念sama閱讀 40,292評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼剧罩,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了座泳?” 一聲冷哼從身側(cè)響起斑响,我...
    開封第一講書人閱讀 39,211評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎钳榨,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體纽门,經(jīng)...
    沈念sama閱讀 45,655評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡薛耻,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,846評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了赏陵。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片饼齿。...
    茶點故事閱讀 39,965評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡饲漾,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出缕溉,到底是詐尸還是另有隱情考传,我是刑警寧澤,帶...
    沈念sama閱讀 35,684評論 5 347
  • 正文 年R本政府宣布证鸥,位于F島的核電站僚楞,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏枉层。R本人自食惡果不足惜泉褐,卻給世界環(huán)境...
    茶點故事閱讀 41,295評論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望鸟蜡。 院中可真熱鬧膜赃,春花似錦、人聲如沸揉忘。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,894評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽泣矛。三九已至疲眷,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間乳蓄,已是汗流浹背咪橙。 一陣腳步聲響...
    開封第一講書人閱讀 33,012評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留虚倒,地道東北人美侦。 一個月前我還...
    沈念sama閱讀 48,126評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像魂奥,于是被迫代替她去往敵國和親菠剩。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,914評論 2 355

推薦閱讀更多精彩內(nèi)容