80

以前见过这个问题,但我的例子似乎不起作用。

const CGFloat *toCol = CGColorGetComponents([[UIColor greenColor] CGColor]);

使用 GDB 查看该数组是空的。有什么提示吗?

4

6 回答 6

110

您提供的代码示例应该可以工作。

尝试这个:

UIColor uicolor = [[UIColor greenColor] retain];
CGColorRef color = [uicolor CGColor];

int numComponents = CGColorGetNumberOfComponents(color);

if (numComponents == 4)
{
  const CGFloat *components = CGColorGetComponents(color);
  CGFloat red = components[0];
  CGFloat green = components[1];
  CGFloat blue = components[2];
  CGFloat alpha = components[3];
}

[uicolor release];
于 2009-05-03T12:12:53.860 回答
38

在 iOS 5 中,您可以使用:

UIColor *color = [UIColor orangeColor];
CGFloat red = 0.0, green = 0.0, blue = 0.0, alpha = 0.0;

if ([color respondsToSelector:@selector(getRed:green:blue:alpha:)]) {
    [color getRed:&red green:&green blue:&blue alpha:&alpha];
} else {
    const CGFloat *components = CGColorGetComponents(color.CGColor);
    red = components[0];
    green = components[1];
    blue = components[2];
    alpha = components[3];
}
于 2011-10-21T16:22:09.917 回答
14

这是一个全面的解决方案,它还考虑了非 RGB 颜色,例如 [UIColor blackColor]

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

}
于 2012-07-22T10:26:29.773 回答
7

只需使用 memcpy:

CGColorRef tmpColor = [[currentColorView backgroundColor] CGColor];
CGFloat newComponents[4] = {};
memcpy(newComponents, CGColorGetComponents(tmpColor), sizeof(newComponents));
// now newComponents is filled with tmpColor rgba data
于 2011-08-07T16:42:30.107 回答
5

感谢威尔斯特的指导。对于任何使用灰度颜色(使用创建colorWithWhite:alpha:)的人,下面的代码示例将让您计算出白色值(HSV 方法不适用于以这种方式创建的颜色)。

CGFloat red = 0.0, green = 0.0, blue = 0.0, alpha = 0.0, white = 0.0;

// This is a non-RGB color
if(CGColorGetNumberOfComponents(self.color.CGColor) == 2) {
    [self.color getWhite:&white alpha:&alpha];
}
else {
    // iOS 5
    if ([self.color respondsToSelector:@selector(getRed:green:blue:alpha:)]) {
        [self.color getRed:&red green:&green blue:&blue alpha:&alpha];
    } else {
        // < iOS 5
        const CGFloat *components = CGColorGetComponents(self.color.CGColor);
        red = components[0];
        green = components[1];
        blue = components[2];
        alpha = components[3];
    }
}
于 2013-01-21T16:32:14.260 回答
1

结帐uicolor-utilities。似乎是一个非常好的库,可以使用 UIColor 执行此操作以及许多其他有用的事情。例如,使用这个库,您可以编写:

CGFloat red = [myColor red];
于 2011-07-03T16:38:01.313 回答