IOS之UI--動(dòng)態(tài)設(shè)置NavigationBar的顏色以及透明度

轉(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。


最后編輯于
?著作權(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)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

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