UIView的alpha、hidden和opaque屬性之間的關(guān)系和區(qū)別

原文http://blog.csdn.net/wzzvictory/article/details/10076323


UIView的這幾個(gè)屬性讓我困惑了好一陣子锯玛,通過翻看官方文檔和stackoverflow等網(wǎng)上資源咐柜,對(duì)它們有了一定理解,現(xiàn)分享出來攘残。如理解有誤拙友,還請(qǐng)大家指出。

一歼郭、alpha

液晶顯示器是由一個(gè)個(gè)的像素點(diǎn)組成的遗契,每個(gè)像素點(diǎn)都可以顯示一個(gè)由RGBA顏色空間組成的一種色值。其中的A就表示透明度alpha病曾,UIView中alpha是一個(gè)浮點(diǎn)值牍蜂,取值范圍0~1.0,表示從完全透明到完全不透明。

當(dāng)把a(bǔ)lpha的值設(shè)置成0以后:

1知态、當(dāng)前的UIView和subview都會(huì)被隱藏捷兰,而不管subview的alpha值為多少。

2负敏、當(dāng)前UIView會(huì)從響應(yīng)者鏈中移除,而響應(yīng)者鏈中的下一個(gè)會(huì)成為第一響應(yīng)者

alpha的默認(rèn)值是1.0秘蛇。

另外其做,更改alpha值時(shí),默認(rèn)是有動(dòng)畫效果的赁还,這是因?yàn)閳D層在Cocoa中是由Core Animation中CALayer表示的妖泄,該動(dòng)畫效果是CALayer的隱含動(dòng)畫。當(dāng)然也有辦法禁用此動(dòng)畫效果艘策,在這就不多述了蹈胡,感興趣的同學(xué)可以繼續(xù)關(guān)注后續(xù)的博客。

二朋蔫、hidden

該屬性為BOOL值罚渐,用來表示UIView是否隱藏,默認(rèn)值是NO驯妄。

當(dāng)值設(shè)為YES時(shí):

1荷并、當(dāng)前的UIView和subview都會(huì)被隱藏,而不管subview的hidden值為多少青扔。

2源织、當(dāng)前UIView會(huì)從響應(yīng)者鏈中移除翩伪,而響應(yīng)者鏈中的下一個(gè)會(huì)成為第一響應(yīng)者

總之,同alpha為0時(shí)的顯示效果相同谈息。具體兩者之間有什么區(qū)別就不清楚了缘屹,如果有知道的還望不吝賜教!

三侠仇、opaque

該屬性為BOOL值轻姿,UIView的默認(rèn)值是YES,但UIButton等子類的默認(rèn)值都是NO傅瞻。opaque表示當(dāng)前UIView是否不透明踢代,不過搞笑的是事實(shí)上它卻決定不了當(dāng)前UIView是不是不透明,比如你將opaque設(shè)為NO嗅骄,該UIView照樣是可見的(上文說過胳挎,是否可見是由alpha或hidden屬性決定的),照理說為NO就表示透明溺森,那就應(yīng)該是不可見的呀慕爬?

賣個(gè)關(guān)子,先看下圖:


圖片發(fā)自簡書App


前面講過屏积,顯示器中的每個(gè)像素點(diǎn)都可以顯示一個(gè)由RGBA顏色空間組成的色值医窿,比如上圖中有紅色和綠色兩個(gè)圖層色塊,對(duì)于沒有交叉的部分炊林,即純紅色和綠色部分來說姥卢,對(duì)應(yīng)位置的像素點(diǎn)只需要簡單的顯示紅或綠,對(duì)應(yīng)的RGBA為(1渣聚,0独榴,0,1)和(0奕枝,1棺榔,0,1)就行了隘道,負(fù)責(zé)圖形顯示的GPU需要很小的計(jì)算量就可以確定像素點(diǎn)對(duì)應(yīng)的顯示內(nèi)容症歇。

問題是紅色和綠色還有相交的一塊,其相交的顏色為黃色谭梗。這里的黃色是怎么來的呢忘晤?原來,GPU會(huì)通過圖層一和圖層二的顏色進(jìn)行圖層混合默辨,計(jì)算出混合部分的顏色德频,最理想情況的計(jì)算公式如下:

R = S + D * ( 1 – Sa )

其中,R表示混合結(jié)果的顏色缩幸,S是源顏色(位于上層的紅色圖層一)壹置,D是目標(biāo)顏色(位于下層的綠色圖層二)竞思,Sa是源顏色的alpha值,即透明度钞护。公式中所有的S和D顏色都假定已經(jīng)預(yù)先乘以了他們的透明度盖喷。

知道圖層混合的基本原理以后,再回到正題說說opaque屬性的作用难咕。當(dāng)UIView的opaque屬性被設(shè)為YES以后课梳,按照上面的公式,也就是Sa的值為1余佃,這個(gè)時(shí)候公式就變成了:

R = S

即不管D為什么暮刃,結(jié)果都一樣。因此GPU將不會(huì)做任何的計(jì)算合成爆土,不需要考慮它下方的任何東西(因?yàn)槎急凰趽踝×?椭懊,而是簡單從這個(gè)層拷貝。這節(jié)省了GPU相當(dāng)大的工作量步势。由此看來氧猬,opaque屬性的真實(shí)用處是給繪圖系統(tǒng)提供一個(gè)性能優(yōu)化開關(guān)!

按照前面的邏輯坏瘩,當(dāng)opaque屬性被設(shè)為YES時(shí)盅抚,GPU就不會(huì)再利用圖層顏色合成公式去合成真正的色值。因此倔矾,如果opaque被設(shè)置成YES妄均,而對(duì)應(yīng)UIView的alpha屬性不為1.0的時(shí)候,就會(huì)有不可預(yù)料的情況發(fā)生哪自,這一點(diǎn)蘋果在官方文檔中有明確的說明:

An opaque view is expected to fill its bounds with entirely opaque content—that is, the content should have an alpha value of 1.0. If the view is opaque and either does not fill its bounds or contains wholly or partially transparent content,the results are unpredictable. You should always set the value of this property to NO if the view is fully or partially transparent.

大家切記4曰蕖!L崽铡!

四匹层、最后

當(dāng)把UIView的alpha屬性設(shè)成0隙笆,或者把hidden設(shè)成YES的時(shí)候,當(dāng)前UIView和它所包含的子UIView都會(huì)變成不可見升筏,同時(shí)也不會(huì)再響應(yīng)event事件撑柔。注意這里是或的關(guān)系,即只要設(shè)置了其中的一個(gè)都會(huì)有此效果您访,而不管另外一個(gè)屬性的值是什么铅忿。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市灵汪,隨后出現(xiàn)的幾起案子檀训,更是在濱河造成了極大的恐慌柑潦,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,590評(píng)論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件峻凫,死亡現(xiàn)場(chǎng)離奇詭異渗鬼,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)荧琼,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,157評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門譬胎,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人命锄,你說我怎么就攤上這事堰乔。” “怎么了脐恩?”我有些...
    開封第一講書人閱讀 169,301評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵镐侯,是天一觀的道長。 經(jīng)常有香客問我被盈,道長析孽,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 60,078評(píng)論 1 300
  • 正文 為了忘掉前任只怎,我火速辦了婚禮袜瞬,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘身堡。我一直安慰自己邓尤,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,082評(píng)論 6 398
  • 文/花漫 我一把揭開白布贴谎。 她就那樣靜靜地躺著汞扎,像睡著了一般。 火紅的嫁衣襯著肌膚如雪擅这。 梳的紋絲不亂的頭發(fā)上澈魄,一...
    開封第一講書人閱讀 52,682評(píng)論 1 312
  • 那天,我揣著相機(jī)與錄音仲翎,去河邊找鬼痹扇。 笑死,一個(gè)胖子當(dāng)著我的面吹牛溯香,可吹牛的內(nèi)容都是我干的鲫构。 我是一名探鬼主播,決...
    沈念sama閱讀 41,155評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼玫坛,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼结笨!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 40,098評(píng)論 0 277
  • 序言:老撾萬榮一對(duì)情侶失蹤炕吸,失蹤者是張志新(化名)和其女友劉穎伐憾,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體算途,經(jīng)...
    沈念sama閱讀 46,638評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡塞耕,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,701評(píng)論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了嘴瓤。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片扫外。...
    茶點(diǎn)故事閱讀 40,852評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖廓脆,靈堂內(nèi)的尸體忽然破棺而出筛谚,到底是詐尸還是另有隱情,我是刑警寧澤停忿,帶...
    沈念sama閱讀 36,520評(píng)論 5 351
  • 正文 年R本政府宣布驾讲,位于F島的核電站,受9級(jí)特大地震影響席赂,放射性物質(zhì)發(fā)生泄漏吮铭。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,181評(píng)論 3 335
  • 文/蒙蒙 一颅停、第九天 我趴在偏房一處隱蔽的房頂上張望谓晌。 院中可真熱鬧,春花似錦癞揉、人聲如沸纸肉。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,674評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽柏肪。三九已至,卻和暖如春芥牌,著一層夾襖步出監(jiān)牢的瞬間烦味,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,788評(píng)論 1 274
  • 我被黑心中介騙來泰國打工壁拉, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留拐叉,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,279評(píng)論 3 379
  • 正文 我出身青樓扇商,卻偏偏與公主長得像,于是被迫代替她去往敵國和親宿礁。 傳聞我的和親對(duì)象是個(gè)殘疾皇子案铺,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,851評(píng)論 2 361

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