Есть ли проблема с CGColorGetComponents? - PullRequest
17 голосов
/ 11 февраля 2012

Когда я звоню 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 Ответ

32 голосов
/ 11 февраля 2012

[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.

...