绘制白色会产生透明的颜色



所以在我的自定义视图中,我试图使用Core Graphics绘制白色/灰色渐变。我有以下代码:

UIColor *color1 = [UIColor whiteColor];
UIColor *color2 = [UIColor colorWithRed:209.0/255.0 green:212.0/255.0 blue:217.0/255.0 alpha:1.0];
CFMutableArrayRef colors = CFArrayCreateMutable(NULL, 0, NULL);
CFArrayAppendValue(colors, color1.CGColor);
CFArrayAppendValue(colors, color2.CGColor);
CGColorSpaceRef colorspace = CGColorSpaceCreateDeviceRGB();
CGFloat locations[2] = {0.0, 1.0};
CGGradientRef gradient = CGGradientCreateWithColors(colorspace, colors, locations);
CGContextDrawLinearGradient(UIGraphicsGetCurrentContext(), gradient, topCenter, bottomCenter, kCGGradientDrawsAfterEndLocation);

我认为这段代码相当简单,应该会产生一个漂亮的白色/灰色渐变。但事实并非如此;它绘制透明/灰色渐变。

我认为这可能与视图的背景颜色有关,它是[UIColor clearColor]。但是我不能改变它,因为我需要我的视图的某些部分是透明的。

任何想法?

UIColor *color1 = [UIColor whiteColor];

上面的行可能在灰度色彩空间中创建了一种颜色。

试试这个:

UIColor *color1 = [UIColor colorWithRed:1.f green:1.f blue:1.f alpha:1.f];

UIColors可以生成在不同颜色空间中定义的颜色。白色将是单色。

下面的代码演示了如何处理它。

CGColorSpaceRef fillColorSpace = CGColorGetColorSpace([self.fillColor CGColor]);
const float* fillColors = CGColorGetComponents([self.fillColor CGColor]);
if (CGColorSpaceGetModel(fillColorSpace) == kCGColorSpaceModelRGB) {
    CGContextSetRGBFillColor(contextRef, fillColors[0],fillColors[1], fillColors[2], fillColors[3]);
} else if (CGColorSpaceGetModel(fillColorSpace) == kCGColorSpaceModelMonochrome){
    CGContextSetGrayFillColor(contextRef, fillColors[0], fillColors[1]);
}

您也可以使用这种方法将单色转换为RGB颜色:

if (CGColorSpaceGetModel(fillColorSpace) == kCGColorSpaceModelMonochrome){
        const float* colors = CGColorGetComponents([self.fillColor CGColor]);
        self.fillColor = [UIColor colorWithRed:colors[0]  
                                         green:colors[0]  
                                          blue:colors[0] 
                                         alpha:colors[1]];
}

现在颜色是RGB,所以你不需要区分不同颜色模型的CG函数。

const float* fillColors = CGColorGetComponents([self.fillColor CGColor]);
CGContextSetRGBFillColor(contextRef, fillColors[0],fillColors[1], fillColors[2], fillColors[3]);

最新更新