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