绘制白色会产生透明色

时间:2011-10-05 19:52:23

标签: iphone objective-c ios cocoa-touch core-graphics

所以在我的自定义视图中,我正在尝试使用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]。但我无法改变这一点,因为我需要让我的观点的某些部分变得透明。

有什么想法吗?

2 个答案:

答案 0 :(得分:4)

UIColor *color1 = [UIColor whiteColor];

上面这行可能会在灰度色彩空间中创建一种颜色。请尝试这样做:

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

答案 1 :(得分:4)

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]);