在UIView中只有白色填充颜色是透明的

时间:2010-09-18 18:41:08

标签: iphone core-graphics

我有一个设置为UIView的{​​{1}}并且一切正常。在opaque = NO我正在进行自定义绘图,这是有效的

drawRect

但是这个

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

导致没有填充(你甚至可以通过它看到我在CGContext上绘制的其他东西)。我怎样才能画出白色填充物?

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

1 个答案:

答案 0 :(得分:18)

为什么不使用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将能够将上下文的颜色空间设置为颜色的颜色空间对象并正确解释颜色对象的组件。