Применить градиент к неквадратной форме, нарисованной с помощью AddArc - PullRequest
1 голос
/ 10 января 2012

У меня есть пара закрытых фигур, которые я рисую в приложении для iPhone, используя CGContextAddArc, и я хотел бы применить к нему градиент, но не могу найти хороших примеров.Все, что я нашел, обрезает границы для ссылки на нарисованную форму где-то CGRect, но мне нужно обрезать границы градиента до формы, отличной от CGRect.Любые идеи / помощь?

Я использую xcode 4.2.1 с раскадровкой и iOS5, хотя эти фигуры рисуются в представлении программно.

Код, который я использую для рисованиянеквадратные формы:

    CGContextRef context = UIGraphicsGetCurrentContext();

//set context-based constants
double widthMiddle = self.frame.size.width/2;
double heightMiddle = self.frame.size.height/2;
double avgDimension = (widthMiddle + heightMiddle) / 2;
float arcRadius = avgDimension * .9;
float innerRadius = avgDimension * .4;

double startAngle = 2 * (sectionNumber - 1) * (M_PI / 3);
double endAngle = (2 * (sectionNumber * (M_PI / 3))) - [sectionSpacing doubleValue];
double interfaceAngle = [sectionSpacing doubleValue] * (innerRadius / arcRadius);
double ratingRadius = innerRadius + ((arcRadius-innerRadius) * percentGood);
double percentInterfaceAngle = interfaceAngle * (1-percentGood);

//NSLog(@"InterfaceAngle and percentInterfaceAngle are: %f/%f", interfaceAngle, percentInterfaceAngle);

//draw grey background shape
CGContextBeginPath(context);

CGContextSetLineWidth(context, [lineWeight doubleValue]);
//CGContextSetStrokeColorWithColor(context, [UIColor blueColor].CGColor);
CGContextSetRGBStrokeColor(context, .65, .65, .65, 1);
CGContextSetAllowsAntialiasing(context, 1);


//outer arc
CGContextAddArc(context,                                                //context
                widthMiddle,                                            //X-value for center point of arc
                heightMiddle,                                           //Y-value for center point of arc
                arcRadius,                                              //Radius of the arc
                startAngle,                   //start angle in radians
                endAngle,    //end angle in radians (2pi = full circle)
                0);                                                     //Clockwise? 1 = true
//inner arc
CGContextAddArc(context,                                                //context
                widthMiddle,                                            //X-value for center point of arc
                heightMiddle,                                           //Y-value for center point of arc
                innerRadius,                                        //Radius of the arc
                endAngle - interfaceAngle,                                   //start angle in radians
                startAngle + interfaceAngle,                                                    //end angle in radians (2pi = full circle)
                1);                                                     //Clockwise? 1 = true
CGContextClosePath(context);



//CGContextSetFillColorWithColor(context, [UIColor redColor].CGColor);
CGContextSetRGBFillColor(context, .65, .65, .65, 1);
//CGContextSetAlpha(context, .6);
CGContextDrawPath(context, kCGPathFillStroke );

1 Ответ

1 голос
/ 10 января 2012

Вы ищете функцию CGContextClip или, возможно, функцию CGContextEOClip.

CGContextClip устанавливает путь отсечения контекста к пересечениюего текущего пути отсечения и его текущего пути, а затем очищает текущий путь.CGContextEOClip делает то же самое, но с другим способом обработки «дыр» на пути.Различия имеют значение только в том случае, если у вас есть путь, который пересекает сам себя или содержит несколько закрытых подпутей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...