Рисование белого цвета приводит к прозрачному цвету - PullRequest
4 голосов
/ 05 октября 2011

Так что в моем собственном представлении я пытаюсь нарисовать белый / серый градиент, используя Core Graphics. У меня есть следующий код:

UIColor *color1 = [UIColor whiteColor];
UIColor *color2 = [UIColor colorWithRed:209.0/255.0 green:212.0/255.0 blue:217.0/255.0 alpha:1.0];

CFMutableArrayRef colors = CFArrayCreateMutable(NULL, 0, NULL);
CFArrayAppendValue(colors, color1.CGColor);
CFArrayAppendValue(colors, color2.CGColor);

CGColorSpaceRef colorspace = CGColorSpaceCreateDeviceRGB();
CGFloat locations[2] = {0.0, 1.0};
CGGradientRef gradient = CGGradientCreateWithColors(colorspace, colors, locations);

CGContextDrawLinearGradient(UIGraphicsGetCurrentContext(), gradient, topCenter, bottomCenter, kCGGradientDrawsAfterEndLocation);

Я думаю, что этот код довольно прост и должен привести к хорошему градиенту белого / серого. Но это не так; он рисует прозрачный / серый градиент.

Я думаю, что это может иметь какое-то отношение к цвету фона представления, который равен [UIColor clearColor]. Но я не могу изменить это, поскольку мне нужно, чтобы некоторые части моего взгляда были прозрачными.

Есть идеи?

Ответы [ 2 ]

4 голосов
/ 06 октября 2011

UIColors может привести к цветам, определенным в другом цветовом пространстве.Белый будет монохромным цветом.

Этот код демонстрирует, как с этим бороться.

CGColorSpaceRef fillColorSpace = CGColorGetColorSpace([self.fillColor CGColor]);
const float* fillColors = CGColorGetComponents([self.fillColor CGColor]);

if (CGColorSpaceGetModel(fillColorSpace) == kCGColorSpaceModelRGB) {
    CGContextSetRGBFillColor(contextRef, fillColors[0],fillColors[1], fillColors[2], fillColors[3]);
} else if (CGColorSpaceGetModel(fillColorSpace) == kCGColorSpaceModelMonochrome){
    CGContextSetGrayFillColor(contextRef, fillColors[0], fillColors[1]);
}

Этот подход также можно использовать для преобразования монохромных цветов в цвета RGB:

if (CGColorSpaceGetModel(fillColorSpace) == kCGColorSpaceModelMonochrome){
        const float* colors = CGColorGetComponents([self.fillColor CGColor]);
        self.fillColor = [UIColor colorWithRed:colors[0]  
                                         green:colors[0]  
                                          blue:colors[0] 
                                         alpha:colors[1]];
}

Теперь цвет - RGB, поэтому вам не нужно различать функции компьютерной графики для разных цветовых моделей.

const float* fillColors = CGColorGetComponents([self.fillColor CGColor]);
CGContextSetRGBFillColor(contextRef, fillColors[0],fillColors[1], fillColors[2], fillColors[3]);
4 голосов
/ 06 октября 2011
UIColor *color1 = [UIColor whiteColor];

Приведенная выше строка, вероятно, создает цвет в цветовом пространстве оттенков серого.

Попробуйте вместо этого:

UIColor *color1 = [UIColor colorWithRed:1.f green:1.f blue:1.f alpha:1.f];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...