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