原文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)子,先看下圖:
前面講過屏积,顯示器中的每個(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è)屬性的值是什么铅忿。