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

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)子,先看下圖:

1.png

前面講過,顯示器中的每個(gè)像素點(diǎn)都可以顯示一個(gè)由RGBA顏色空間組成的色值,比如上圖中有紅色和綠色兩個(gè)圖層色塊,對(duì)于沒有交叉的部分,即純紅色和綠色部分來說,對(duì)應(yīng)位置的像素點(diǎn)只需要簡(jiǎ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)槎急凰趽踝×?,而是簡(jiǎ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 of1.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 toNOif the view is fully or partially transparent.

大家切記?。。。?/p>

四、最后

當(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è)屬性的值是什么。

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

如果你感覺對(duì)你有幫助,請(qǐng)留言或者關(guān)注我的微信公眾號(hào)西河老伯iOS開發(fā)來支持我!

最后編輯于
?著作權(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)容