2011-10-05 179 views
4

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

任何想法?

+1

看这个http://stackoverflow.com/questions/3060010/all-colors-work-except-whitecolor它似乎有关,但没有确切的问题,所以不想标记为重复。 –

+0

当您将背景颜色从透明颜色更改为白色时,请将事情看起来正确吗? – Zigglzworth

+0

是的,但不幸的是,这不是我的选择 – Rits

回答

4
UIColor *color1 = [UIColor whiteColor]; 

上面这行可能会在灰度色彩空间中创建一个颜色。

尝试此代替:

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

是的,工作!谢谢! – Rits

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