Заметили это раньше, но мой пример не работает.
const CGFloat *toCol = CGColorGetComponents([[UIColor greenColor] CGColor]);
Массив пуст, глядя на него с помощью GDB. Любые подсказки?
Заметили это раньше, но мой пример не работает.
const CGFloat *toCol = CGColorGetComponents([[UIColor greenColor] CGColor]);
Массив пуст, глядя на него с помощью GDB. Любые подсказки?
Образец кода, который вы предоставили, должен работать.
Попробуйте следующее:
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];
В 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];
}
Здесь круглое решение, которое также учитывает цвета, отличные от 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];
}
Просто используйте memcpy:
CGColorRef tmpColor = [[currentColorView backgroundColor] CGColor];
CGFloat newComponents[4] = {};
memcpy(newComponents, CGColorGetComponents(tmpColor), sizeof(newComponents));
// now newComponents is filled with tmpColor rgba data
Спасибо за направление Уиллстер. Для любого из тех, кто использует цвет в оттенках серого (созданный с помощью 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];
    }
}
Эта статья помогла мне решить эту проблему или, по крайней мере, создать инфраструктуру для ее решения.
http://developer.apple.com/iphone/library/qa/qa2007/qa1509.html
Вот еще несколько прямых примеров кода для получения RGB-компонентов из произвольного цвета:
Оформить заказ uicolor-utilities. Кажется, очень хорошая библиотека для этого и много других полезных вещей с UIColor. Например, с помощью этой библиотеки вы можете написать:
CGFloat red = [myColor red];