Есть ли проблема с CGColorGetComponents?

Когда я вызываю CGColorGetComponents с CGColor, возвращаемым с UIColor, он работает корректно, за исключением белого и черного.

Здесь код...

CGColorRef myColorRef = [[UIColor whiteColor] CGColor];

const CGFloat * colorComponents = CGColorGetComponents(myColorRef);

NSLog(@"r=%f, g=%f, b=%f, a=%f",
    colorComponents[0],
    colorComponents[1],
    colorComponents[2],
    colorComponents[3]);

Этот журнал

r=1.000000, g=1.000000, b=0.000000, a=0.000000

Обратите внимание, что оба B и A равны нулю, а не одному.

Если вы заменяете другие цвета, такие как redColor, blueColor и т.д., это работает... значения RGB и A устанавливаются так, как можно было бы ожидать. Но опять же, черно-белые результаты дают нечетные результаты. Есть ли какая-то проблема с этой функцией или есть ли какое-то решение/задача, которую я должен делать?

Ответ 1

[UIColor whiteColor] и [UIColor blackColor] используйте [UIColor colorWithWhite:alpha:] для создания UIColor. Это означает, что этот CGColorRef имеет только 2 цветовых компонента, а не 4 цвета, созданные с помощью [UIColor colorWithRed:green:blue:alpha:].

Конечно, вы тоже можете NSLog.

if (CGColorGetNumberOfComponents(myColorRef) == 2) {
    const CGFloat *colorComponents = CGColorGetComponents(myColorRef);
    NSLog(@"r=%f, g=%f, b=%f, a=%f", colorComponents[0], colorComponents[0], colorComponents[0], colorComponents[1]);
}
else if (CGColorGetNumberOfComponents(myColorRef) == 4) {
    const CGFloat * colorComponents = CGColorGetComponents(myColorRef);
    NSLog(@"r=%f, g=%f, b=%f, a=%f", colorComponents[0], colorComponents[1], colorComponents[2], colorComponents[3]);
}
else {
    NSLog(@"What is this?");
}

Помните, что существуют разные цветовые пространства. Поэтому, если вам нужен этот код для более чем протоколирования (например, сохранение строк RGBA в json), вам нужно также проверить (и, возможно, преобразовать) colorSpace.