轉(zhuǎn)載需注明出處:http://www.cnblogs.com/goodboy-heyang/p/5246447.html
前言:有時(shí)候我們需要設(shè)置UINavigationController的導(dǎo)航條NavigationBar的顏色為透明度,這時(shí)候就需要使用到NavigationBar的barStyle這個(gè)屬性:

再看QQ空間的仿制項(xiàng)目示例:

代碼使用示例:nc.navigationBar.barStyle = UIBarStyleDefault;
<備注:下面全部展示的UI圖例,window.view背景是綠色的>
一、在沒有設(shè)置背景圖片的情況下:
1、UIBarStyleDefaul
因?yàn)槭悄J(rèn),所以可以不設(shè)置barStyle這個(gè)屬性。

2、UIBarStyleBlack
3、UIBarStyleBlackOpaque
4、UIBarStyleBlackTranslucent(Translucent半透明)
這里2~4都是一樣的:

二、將1X1的透明圖片或者是空UIImage對(duì)象(建議直接使用UIImage對(duì)象,連圖片都不需要了),設(shè)置為背景
代碼實(shí)例:

當(dāng)然,還有一個(gè)前提需要提出來:一下實(shí)例圖都是沒有添加下面字段的(XCode 7.2.1版本)

1、UIBarStyleDefaul

2、UIBarStyleBlack
3、UIBarStyleBlackOpaque
4、UIBarStyleBlackTranslucent(Translucent半透明)
這里2~4都是一樣的:

三、將1X1的全黑色的圖片,設(shè)置為背景
1、UIBarStyleDefaul

2、UIBarStyleBlack
3、UIBarStyleBlackOpaque
4、UIBarStyleBlackTranslucent(Translucent半透明)
這里2~4都是一樣的:

四、將1X1的紅色的圖片,設(shè)置為背景
1、UIBarStyleDefaul

2、UIBarStyleBlack
3、UIBarStyleBlackOpaque
4、UIBarStyleBlackTranslucent(Translucent半透明)
這里2~4都是一樣的:

附:遇到的還沒有解決的問題:
因?yàn)槲铱吹絈Q空間的導(dǎo)航控制器和狀態(tài)欄是能夠連在一起同時(shí)會(huì)漸變顏色,所以就講上面通過圖片設(shè)置背景換成直接更改導(dǎo)航條UINavigationBar的背景顏色試了試;
我就添加了一行代碼:

效果卻是這樣的:

然后我試了試默認(rèn)不設(shè)置背景UIImage對(duì)象或者是不設(shè)置背景透明的圖片:

效果更加不好看了:

解決思路:
我不知道QQ空間是怎么做到的,但是我下面會(huì)給出三種思路,其中兩種思路會(huì)有具體實(shí)現(xiàn)。如果有哪位大神有更好的想法,歡迎交流,切磋切磋。
這里展示一個(gè)出問題的效果,下面就針對(duì)這個(gè)情況進(jìn)行解決問題:

思路1、自定義一個(gè)UINavigationBar,替換調(diào)用原來的自帶的UINavigationBar。
這個(gè)是可以實(shí)現(xiàn)的,但是我沒有去實(shí)踐,我就偷懶啦??,交給你們?nèi)?shí)踐好了,可以試試使用KVC替換。
思路2、查看UINavigationBar的子UI元素,看看是否會(huì)有可以挖掘的對(duì)象。
2-1、直接在官方頭文件找,發(fā)現(xiàn)是木有相關(guān)屬性的。
2-2、然后我就運(yùn)行程序,在xcode的頂部菜單欄找到Debug > View Debugging > Capture View Hierarchy

2-3、其實(shí)NavigationBar的不單單是一個(gè)UIView,通過更改其Frame值,我一直沒成功,所以另尋他路。有大神如果用更改frame值成功的多交流啊。
2-4、然后我就從調(diào)試的角度窺探其NavigationBar的私有屬性,想試試KVC。從上面的圖中,NavigationBar有一個(gè)子UIView,那就是UINavigationBarBackground。
那么如何找到這個(gè)UINavigationBarBackground類型的子UIView呢:

然后,我就在這個(gè)類別中,根據(jù)實(shí)際需求,先簡(jiǎn)單的實(shí)現(xiàn)以下:

最后,外部在ViewController.m文件中導(dǎo)入這個(gè)類別,然后調(diào)用,看看運(yùn)行結(jié)果:

運(yùn)行結(jié)果:
表示,這個(gè)方法是可行成功的。

最后,我根據(jù)需求,這個(gè)需求就是可以實(shí)時(shí)改變?cè)搶?dǎo)航條的透明度和顏色,然后本人進(jìn)行了代碼的優(yōu)化,代碼我已經(jīng)備份好了。
可以看本人不斷更新的一篇博客筆記下載使用:《IOS開發(fā)--常用工具類收集整理(Objective-C)(持續(xù)更新)》
或者直接到本人的github上去下載也可以:https://github.com/HeYang123456789/NavigationBarResetBackgroundDemo
思路3:為系統(tǒng)的UINavigationBar添加一個(gè)子UIView,然后對(duì)該UIView進(jìn)行操作即可
這個(gè)就可以到大神團(tuán)隊(duì)的bolg上學(xué)習(xí)了,該blog網(wǎng)址是:動(dòng)態(tài)修改UINavigationBar的背景色


該源碼也可以到本人備份的百度云鏈接:http://pan.baidu.com/s/1sjYUL33密碼: si38 下載
總結(jié)一下,最好的方式就是第三種思路,因?yàn)楦鶕?jù)實(shí)際需求,往往自定義可以更具有拓展性,可以滿足更多的需求,比如,第三種思路中提到的插入添加一個(gè)UIView,這個(gè)UIView可以是自定義的。
這樣的話,比如QQ控件的導(dǎo)航條上面還有一個(gè)Activity Indictor View,你下拉刷新的時(shí)候,它就旋轉(zhuǎn),要添加這樣的功能,最好的方式就是添加一個(gè)自定義的UIView,這個(gè)自定義的UIView中可以添加這個(gè)Activity Indictor View。