2009-09-30 16 views
49

我得到一個的UIColor此方法返回:我如何從UIColor對象獲取紅綠藍和Alpha背?

- (UIColor *)getColor { 
return [UIColor colorWithRed:redSlider.value green:greenSlider.value blue:blueSlider.value alpha:1.0]; 
} 

並獲得顏色是這樣的:

SelectedColor=[(ColorPickerView *)alertView getColor]; 

現在我想紅,綠,藍從SelectedColor,爲了使用這些值。我想要0和1之間的值。另外,當我使用SelectedColor.CGColor時,我的應用程序崩潰。

+8

附註:你應該看看命名約定。 'getColor'是不好的,有兩個原因,首先它使用get-prefix,這是Java-devs常見的錯誤,其次它沒有描述它是什麼樣的顏色。更好的名字可能是'userSelectedColor'。看看UIKit的名字getter和屬性如何,並效仿。 – PeyloW

回答

107

訪問SelectedColor.CGColor時,可能是因爲你不從getColor保留結果的原因崩潰,也許你需要的是:

SelectedColor = [[(ColorPickerView *)alertView getColor] retain]; 

只能從UIColor得到RGB色彩成分是使用RGB顏色空間,因爲您使用的是colorWithRed:green:blue:alpha:這不是問題,但如果您的代碼發生更改,則可能會有所不同。

憑藉這記讓顏色分量是很容易的:

const CGFloat* components = CGColorGetComponents(SelectedColor.CGColor); 
NSLog(@"Red: %f", components[0]); 
NSLog(@"Green: %f", components[1]); 
NSLog(@"Blue: %f", components[2]); 
NSLog(@"Alpha: %f", CGColorGetAlpha(SelectedColor.CGColor)); 
+0

感謝PeyloW.你知道ihpone中的圖像掩蓋嗎? –

+0

像掩蔽掉圓角等?當然要添加一個新問題。 – PeyloW

+0

嗨,PeyloW!我使用了相同的顏色,但是當我通過黑色時,它會給出綠色的顏色成分。你知道爲什麼發生這種情況你可以看到我在這裏同樣的帖子 - > http://stackoverflow.com/questions/4155642/how-to-get-color-components-of-a-cgcolor-correctly – Ganesh

4

我想你應該有一個a look here,其中人工魚礁指南顯示瞭如何支持擴展UIColor類用於訪問顏色分量。

1

的這段代碼應與RGB和灰度工作:

CGFloat *components = (CGFloat *) CGColorGetComponents(<UIColor instance>.CGColor); 
if(CGColorGetNumberOfComponents(<UIColor instance>.CGColor) == 2) 
{ 
    //assuming it is grayscale - copy the first value 
    components[2] = components[1] = components[0]; 
} 
22

該解決方案適用於非RGB顏色以及例如黑色或白色。

UIColor *color = [UIColor blackColor]; 
CGFloat red = 0.0, green = 0.0, blue = 0.0, alpha = 0.0; 
// iOS 5 
if ([color respondsToSelector:@selector(getRed:green:blue:alpha:)]) { 
    [color getRed:&red green:&green blue:&blue alpha:&alpha]; 
} else { 
    // < iOS 5 
    const CGFloat *components = CGColorGetComponents(color.CGColor); 
    red = components[0]; 
    green = components[1]; 
    blue = components[2]; 
    alpha = components[3]; 
} 

// This is a non-RGB color 
if(CGColorGetNumberOfComponents(color.CGColor) == 2) { 
    CGFloat hue; 
    CGFloat saturation; 
    CGFloat brightness; 
    [color getHue:&hue saturation:&saturation brightness:&brightness alpha:&alpha]; 

} 
+0

「非RGB」代碼塊也僅限於iOS5 +。您可能希望將其標記爲這樣。 –

7

在大多數情況下,這將工作,除非轉換到RGB不起作用。

float red, green, blue, alpha; 
BOOL conversionToRGBWentOk = [color getRed:&red green:&green blue:&blue alpha:&alpha]; 

這就是這些方法的用途,事實上,但是,如果conversionToRGBWentOkNO,則會出現問題。

+1

謝謝你,你是我見過的最好的解決方案。 –

+1

但它導致我的ios4.3模擬器崩潰。它與IOS5 +兼容。 –

2

你只是簡單的做這

CGFloat red,green,blue,alpha; 

[UIColorobject getRed:&red green:&green blue:&blue alpha:&alpha]; 
在紅,綠,藍和alpha

你RGB值 如果您有任何疑問,請向...

感謝

+0

兩個人已經發布該代碼... – nschum

0

只需添加如示例中所示的屬性ColorLiteral。 Xcode會提示你一整套你可以選擇的顏色。

self.view.backgroundColor = ColorLiteral 
0

我認爲這將是一種方式。如果您還需要使用alpha參數,則可以像輸入R G和B一樣從輸入中插入alpha。

- (UIColor *)getColorBetweenColor:(UIColor *)color1 andColor:(UIColor *)color2 percentage:(CGFloat)percent { 
    CGFloat red1, green1, blue1, alpha1; 
    CGFloat red2, green2, blue2, alpha2; 

    [color1 getRed:&red1 green:&green1 blue:&blue1 alpha:&alpha1]; 
    [color2 getRed:&red2 green:&green2 blue:&blue2 alpha:&alpha2]; 

    double resultRed = red1 + percent * (red2 - red1); 
    double resultGreen = green1 + percent * (green2 - green1); 
    double resultBlue = blue1 + percent * (blue2 - blue1); 

    return [UIColor colorWithRed:resultRed green:resultGreen blue:resultBlue alpha:1]; 
} 
相關問題