2011-10-05 172 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]);