2010-09-18 119 views
8

我有一個UIView設置爲opaque = NO,它的一切都很好。在drawRect我在做自定義繪製,這一點也適用在UIView中只有白色填充顏色是透明的

CGContextSetFillColor(context, CGColorGetComponents([UIColor blueColor].CGColor)); 
CGContextFillRect(context, labelOutside); 
CGContextAddRect(context, labelOutside); 

但這

CGContextSetFillColor(context, CGColorGetComponents([UIColor whiteColor].CGColor)); 
CGContextFillRect(context, labelOutside); 
CGContextAddRect(context, labelOutside); 

導致無填充正在生產(你甚至可以看到,我通過它吸取了CGContext上其他的東西)。我如何繪製白色填充?

注意:如果我設置控件不是不透明,它仍然不起作用。

回答

17

爲什麼不使用CGContextSetFillColorWithColor?然後,您可以直接傳遞CGColor對象,而不是提取其組件,並假定它與上下文位於相同的顏色空間中。

編輯補充:

這個作品

CGContextSetFillColor(context, CGColorGetComponents([UIColor blueColor].CGColor)); 

但這

CGContextSetFillColor(context, CGColorGetComponents([UIColor whiteColor].CGColor)); 

導致無填充正在生產(你甚至可以看到我在畫其他的東西CGContext通過它)。

正如我所提到的,這種設置填充顏色的方法假定顏色與上下文處於相同的顏色空間。

通常情況下,大多數CGContexts都在RGB色彩空間中。另一方面,whiteColor幾乎可以肯定地處於白色空間,它只有一個或兩個(白色和alpha)分量。

因此,由於上下文位於RGB色彩空間中,所以CGContextSetFillColor預計會傳遞三個或四個(紅色,綠色,藍色和alpha)組件。當你得到whiteColor的CGColor組件時,你會得到一個指向僅包含兩個組件的C數組的指針。無論如何,CGContextSetFillColor都會讀取它想要的三個或四個組件;如果你通過較少,它可能會發現後面的垃圾,或者它可能找到零。

如果它在alpha位置找到一個零,那麼結果是您已經將填充顏色設置爲黃色(紅色= 1.0,綠色= 1.0,藍色= 0.0)和白色(全部三個= 1.0)與零阿爾法。這是導致填充不顯示的原因:您正在填充透明顏色。

問題是上下文所在的顏色空間(有三個或四個組件)和顏色所在的顏色空間(有一個或兩個組件)之間的不匹配。解決方案是消除不匹配,這是CGContextSetFillColorWithColor所做的:因爲您傳遞的是整個CGColor對象,而不僅僅是一個數組數組,Core Graphics將能夠將上下文的顏色空間設置爲顏色對象的顏色空間,並解釋顏色對象的組件正確。

+2

太棒了,謝謝! 'CGContextSetFillColorWithColor(context,[UIColor whiteColor] .CGColor);' – 2010-09-18 21:09:13

+0

很好的解釋謝謝 – 2010-09-26 03:42:38

+0

很好的解釋,非常好用。 – CVertex 2014-03-26 06:30:54