iOS — Core Graphics работает с цветами, но не с черным, белым и серым

Я рисую простой обведенный круг, используя следующий класс:

 @implementation StrokedCircle

 - (id)initWithRadius:(CGFloat)radius strokeWidth:(CGFloat)strokeWidth strokeColor:(UIColor *)strokeColor
 {
     self = [super initWithRadius:radius];
     if (self)
     {
         _strokeWidth = strokeWidth;
         _strokeColor  = strokeColor;
     }
     return self;
 }


 - (void)drawRect:(CGRect)rect
 {
     NSLog(@"Drawing with color %@ and stroke width %f", self.strokeColor, self.strokeWidth);

     CGContextRef context = UIGraphicsGetCurrentContext();
     CGRect circleRect = CGRectInset(rect, self.strokeWidth, self.strokeWidth);
     CGContextAddEllipseInRect(context, circleRect);
     CGContextSetLineWidth(context, self.strokeWidth);
     CGContextSetStrokeColor(context, CGColorGetComponents([self.strokeColor CGColor]));
     CGContextStrokePath(context);
 }

 @end

Примечание: суперкласс представляет собой простой круг (подкласс UIView) с установленным свойством radius и где фоновый цвет представления установлен на clearColor.

В контроллере представления я добавляю следующий код в viewDidLoad:

 - (void)viewDidLoad
 {
     [super viewDidLoad];
     StrokedCircle *strokedCircle = [[StrokedCircle alloc] initWithRadius:50.0 strokeWidth:1.0 strokeColor:[UIColor blueColor]];
     strokedCircle.center = self.view.center;
     [self.view addSubview:strokedCircle];
 }

Это на самом деле работает нормально, консоль выводит: 2014-06-14 10:31:58.270 ShapeTester[1445:60b] Drawing with color UIDeviceRGBColorSpace 0 0 1 1 and stroke width 1.000000 и синий кружок отображается в середине экрана.

синий заштрихованный круг

Однако, когда я изменяю цвет на [UIUColor blackColor], [UIColor grayColor] или [UIColor whiteColor] (а затем также изменяю вид backgroundColor), круг больше не отображается.

Кто-нибудь знает, в чем причина такого поведения? Разве основная графика не рисует оттенки серого? Я прочитал соответствующий раздел в Руководство по программированию базовой графики, но ничего подобного там не упоминалось.


person nburk    schedule 14.06.2014    source источник


Ответы (1)


Черный, белый и серый (возвращаемые указанными вами методами) не входят в цветовое пространство RGB. Они находятся в цветовом пространстве оттенков серого. Цветовое пространство оттенков серого имеет только один компонент (плюс альфа), а не три (плюс альфа). Таким образом, вы устанавливаете только один из компонентов цвета обводки, а два других компонента не определены. Вы, вероятно, в конечном итоге устанавливаете нулевое значение альфы из-за этой проблемы, так что вы ничего не получаете.

Не используйте CGContextSetStrokeColor. Это требует, чтобы вы беспокоились о цветовом пространстве (которое вам нужно было бы установить с помощью CGContextSetStrokeColorSpace). Вместо этого используйте CGContextSetStrokeColorWithColor, который устанавливает как цветовое пространство, так и цветовые компоненты:

CGContextSetStrokeColorWithColor(context, self.strokeColor.CGColor);
person rob mayoff    schedule 14.06.2014