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

Dan*_*ark 8 iphone core-graphics

我已经UIView设置了一个opaque = NO并且一切正常.在drawRect我正在做自定义绘图,这是有效的

CGContextSetFillColor(context, CGColorGetComponents([UIColor blueColor].CGColor)); 
CGContextFillRect(context, labelOutside);
CGContextAddRect(context, labelOutside);
Run Code Online (Sandbox Code Playgroud)

但是这个

CGContextSetFillColor(context, CGColorGetComponents([UIColor whiteColor].CGColor)); 
CGContextFillRect(context, labelOutside);
CGContextAddRect(context, labelOutside);
Run Code Online (Sandbox Code Playgroud)

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

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

Pet*_*sey 18

为什么不用CGContextSetFillColorWithColor?然后,您可以直接传递CGColor对象,而不是提取其组件并假设它与上下文位于相同的颜色空间中.

编辑添加:

这很有效

CGContextSetFillColor(context, CGColorGetComponents([UIColor blueColor].CGColor)); 
Run Code Online (Sandbox Code Playgroud)

但是这个

CGContextSetFillColor(context, CGColorGetComponents([UIColor whiteColor].CGColor)); 
Run Code Online (Sandbox Code Playgroud)

结果是没有填充(你甚至可以通过它看到我在CGContext上绘制的其他东西).

正如我所提到的,这种设置填充颜色的方式假设颜色与上下文位于相同的颜色空间中.

通常,大多数CGContexts都在RGB颜色空间中.whiteColor另一方面,几乎可以肯定是在白色空间中,它只有一个或两个(白色和阿尔法)成分.

因此,由于上下文位于RGB颜色空间中,因此CGContextSetFillColor期望传递三个或四个(红色,绿色,蓝色和alpha)组件.当你得到whiteColorCGColor 的组件时,你会得到一个指向C数组的指针,该数组只包含两个组件.CGContextSetFillColor将读取它想要的三个或四个组件,无论如何; 如果你传递的更少,它可能会在它们之后找到垃圾,或者它可能会找到零.

如果它在alpha位置找到零,则结果是您已将填充颜色设置为黄色(红色= 1.0,绿色= 1.0,蓝色= 0.0)和白色(全部三个= 1.0)之间的零值.这就是导致填充不显示的原因:您正在填充透明色.

问题在于上下文所在的颜色空间(具有三个或四个组件)与颜色所在的颜色空间(具有一个或两个组件)之间的不匹配.解决方案是消除不匹配,这就是CGContextSetFillColorWithColor:由于您传递的是整个CGColor对象,而不仅仅是数字数组,因此Core Graphics将能够将上下文的颜色空间设置为颜色对象的颜色空间并解释颜色对象的组件正确.

  • 太好了,谢谢!`CGContextSetFillColorWithColor(context,[UIColor whiteColor] .CGColor);` (2认同)