UIView的alpha、hidden和opaque屬性之間的關系和差別
轉載請注明出處
一、alpha
液晶顯示器是由一個個的像素點組成的,每個像素點都可以顯示一個由RGBA顔色空間組成的一種色值。其中的A就表示透明度alpha,UIView中alpha是一個浮點值,取值範圍0~1.0,表示從完全透明到完全不透明。
當把alpha的值設定成0以後:
1、目前的UIView和subview都會被隐藏,而不管subview的alpha值為多少。
2、目前UIView會從響應者鍊中移除,而響應者鍊中的下一個會成為第一響應者
alpha的預設值是1.0。
另外,更改alpha值時,預設是有動畫效果的,這是因為圖層在Cocoa中是由Core Animation中CALayer表示的,該動畫效果是CALayer的隐含動畫。當然也有辦法禁用此動畫效果,在這就不多述了,感興趣的同學可以繼續關注後續的部落格。
二、hidden
該屬性為BOOL值,用來表示UIView是否隐藏,預設值是NO。
當值設為YES時:
1、目前的UIView和subview都會被隐藏,而不管subview的hidden值為多少。
總之,同alpha為0時的顯示效果相同。具體兩者之間有什麼差別就不清楚了,如果有知道的還望不吝賜教!
三、opaque
該屬性為BOOL值,UIView的預設值是YES,但UIButton等子類的預設值都是NO。opaque表示目前UIView是否不透明,不過搞笑的是事實上它卻決定不了目前UIView是不是不透明,比如你将opaque設為NO,該UIView照樣是可見的(上文說過,是否可見是由alpha或hidden屬性決定的),照理說為NO就表示透明,那就應該是不可見的呀?
賣個關子,先看下圖:

前面講過,顯示器中的每個像素點都可以顯示一個由RGBA顔色空間組成的色值,比如上圖中有紅色和綠色兩個圖層色塊,對于沒有交叉的部分,即純紅色和綠色部分來說,對應位置的像素點隻需要簡單的顯示紅或綠,對應的RGBA為(1,0,0,1)和(0,1,0,1)就行了,負責圖形顯示的GPU需要很小的計算量就可以确定像素點對應的顯示内容。
問題是紅色和綠色還有相交的一塊,其相交的顔色為黃色。這裡的黃色是怎麼來的呢?原來,GPU會通過圖層一和圖層二的顔色進行圖層混合,計算出混合部分的顔色,最理想情況的計算公式如下:
R = S + D * ( 1 – Sa )
其中,R表示混合結果的顔色,S是源顔色(位于上層的紅色圖層一),D是目标顔色(位于下層的綠色圖層二),Sa是源顔色的alpha值,即透明度。公式中所有的S和D顔色都假定已經預先乘以了他們的透明度。
知道圖層混合的基本原理以後,再回到正題說說opaque屬性的作用。當UIView的opaque屬性被設為YES以後,按照上面的公式,也就是Sa的值為1,這個時候公式就變成了:
R = S
即不管D為什麼,結果都一樣。是以GPU将不會做任何的計算合成,不需要考慮它下方的任何東西(因為都被它遮擋住了),而是簡單從這個層拷貝。這節省了GPU相當大的工作量。由此看來,opaque屬性的真實用處是給繪圖系統提供一個性能優化開關!
按照前面的邏輯,當opaque屬性被設為YES時,GPU就不會再利用圖層顔色合成公式去合成真正的色值。是以,如果opaque被設定成YES,而對應UIView的alpha屬性不為1.0的時候,就會有不可預料的情況發生,這一點蘋果在官方文檔中有明确的說明:
An opaque view is expected to fill its bounds with entirely opaque content—that is, the content should have an alpha value of <code>1.0</code>. 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 <code>NO</code> if the view is fully or partially transparent.
大家切記!!!!
四、最後
當把UIView的alpha屬性設成0,或者把hidden設成YES的時候,目前UIView和它所包含的子UIView都會變成不可見,同時也不會再響應event事件。注意這裡是或的關系,即隻要設定了其中的一個都會有此效果,而不管另外一個屬性的值是什麼。
歡迎加群互相學習,共同進步。QQ群:iOS: 58099570 | Android: 572064792 | Nodejs:329118122 做人要厚道,轉載請注明出處!
本文轉自張昺華-sky部落格園部落格,原文連結:http://www.cnblogs.com/sunshine-anycall/p/3336397.html,如需轉載請自行聯系原作者