2010-09-18 96 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