Чертане на множество дъги с помощта на Core Graphics

Опитвам се да нарисувам два концентрични кръга с помощта на Core Graphics. Бих очаквал следният код да нарисува син кръг и по-малък бял кръг вътре, но той просто рисува синия кръг. какво ми липсва

CGContextRef c = UIGraphicsGetCurrentContext();

CGContextAddArc(c, self.bounds.size.width/2, self.bounds.size.height/2, 100, 0, M_PI * 2, true);
CGContextSetFillColor(c, CGColorGetComponents([[UIColor blueColor] CGColor]));
CGContextFillPath(c);

CGContextAddArc(c, self.bounds.size.width/2, self.bounds.size.height/2, 90, 0, M_PI * 2, true);
CGContextSetFillColor(c, CGColorGetComponents([[UIColor whiteColor] CGColor]));
CGContextFillPath(c);

person Huhwha    schedule 14.08.2013    source източник


Отговори (1)


Задавате цвета на запълване по ненужно индиректен начин. Направете това вместо това:

CGContextAddArc(c, self.bounds.size.width/2, self.bounds.size.height/2, 100, 0, M_PI * 2, true);
CGContextSetFillColorWithColor(c, [[UIColor blueColor] CGColor]);
CGContextFillPath(c);

CGContextAddArc(c, self.bounds.size.width/2, self.bounds.size.height/2, 90, 0, M_PI * 2, true);
CGContextSetFillColorWithColor(c, [[UIColor whiteColor] CGColor]);
CGContextFillPath(c);

Или, още по-добре, просто използвайте директно методите за рисуване на UIKit:

[[UIColor blueColor] setFill];
[[UIBezierPath bezierPathWithArcCenter:CGPointMake(self.bounds.size.width/2, self.bounds.size.height/2) radius:100 startAngle:0 endAngle:M_PI * 2 clockwise:YES] fill];

[[UIColor whiteColor] setFill];
[[UIBezierPath bezierPathWithArcCenter:CGPointMake(self.bounds.size.width/2, self.bounds.size.height/2) radius:90 startAngle:0 endAngle:M_PI * 2 clockwise:YES] fill];

Вашият код е неуспешен, защото [[UIColor whiteColor] CGColor] връща цвят в "сивото" цветово пространство, което има само два компонента, "сива" стойност (0 за черно, 1 за бяло) и алфа стойност. В този случай контекстът е RGBA, така че CGContextSetFillColor очаква да види 4 компонента, три за RGB и един за алфа.

The документацията за CGContextSetFillColor посочва:

Имайте предвид, че предпочитаният API за използване сега е CGContextSetFillColorWithColor.

person Kurt Revis    schedule 15.08.2013
comment
„контекстът е RGBA“ е малко подвеждащо; няма толкова значение какво цветово пространство контекстът използва за поддръжка, а по-скоро какво е неговото запълване на цветово пространство е. По подразбиране не се споменава; за чисто нов контекст, вероятно е или RGB, или фоновото цветово пространство на контекста (което обикновено е RGB), но настройването на цвета на запълване с SetFillColorWithColor, SetRGBFillColor и т.н. ще зададе цветовото пространство на запълване като страничен ефект. - person Peter Hosey; 16.08.2013
comment
… Така че, например, ако трябва да SetFillColorWithColor бял цвят, запълващото цветово пространство тогава ще бъде бяло цветово пространство и SetFillColor ще очаква само един или два компонента – дори ако контекстът на контекста е RGB. - person Peter Hosey; 16.08.2013
comment
@PeterHosey: Абсолютно правилно, опростявах твърде много за най-често срещания случай в приложение за iOS или Mac. В много години работа с CG не мога да кажа, че някога съм се притеснявал за цветовото пространство за запълване. Може би просто съм имал късмет. - person Kurt Revis; 16.08.2013
comment
Появиха се няколко преди пъти, но да, доста рядко е. - person Peter Hosey; 16.08.2013