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