Использование CGContext для рисования линии - PullRequest
6 голосов
/ 23 февраля 2012

Я хотел нарисовать линию, используя CGContext, и пока у меня есть:

CGContextRef context = UIGraphicsGetCurrentContext();
CGContextSetStrokeColorWithColor(context, [UIColor blackColor].CGColor);
CGContextSetLineWidth(context, 1.0f);
CGContextMoveToPoint(context, 10, 10); 
CGContextAddLineToPoint(context, 100, 50);
CGContextStrokePath(context);

Он всегда рисует от верхнего левого угла до верхнего нижнего правого угла. Как я могу настроить начало и конец начала строки? Как мне отрегулировать длину линии?

Ответы [ 2 ]

8 голосов
/ 23 февраля 2012

CoreGraphics == Good Times.

Прошло много времени с тех пор, как я делал что-то от руки, что я делаю в эти дни, чтобы построить все до операций рисования.Помните, что существует неявный «курсор» со времен Logo , и вы можете перемещать его, не выполняя операцию рисования, но вы должны указать это.Я думаю, что хорошим подходом (по крайней мере для статических фигур) является создание тех путей, которые вы должны будете сначала нарисовать, а затем снова и снова использовать путь для таких вещей, как заливка, обводка, заливка.

   CGColorRef fillColor = // yadda
   CGColorRef strokeColor = // yadda

   const CGFloat radius = 5.0;

   // Create the path first - rounded rectangle
   CGMutablePathRef path = CGPathCreateMutable();
   CGPathMoveToPoint(path, NULL, 100.0 - radius, 10.0);
   CGPathAddLineToPoint(path, NULL, 10.0 + radius, 10.0);
   CGPathAddArcToPoint(path, NULL, 10.0, 10.0, 10.0, 10.0 + radius, radius);
   CGPathAddLineToPoint(path, NULL, 10.0, 100.0 - radius);
   CGPathAddArcToPoint(path, NULL, 10.0, 100.0, 10.0 + radius, 100.0, radius);
   CGPathAddLineToPoint(path, NULL, 100.0 - radius, 100.0);
   CGPathAddArcToPoint(path, NULL, 100.0, 100.0, 100.0, 100.0 - radius, radius);
   CGPathAddLineToPoint(path, NULL, 100.0, 10.0 + radius);
   CGPathAddArcToPoint(path, NULL, 100.0, 10.0, 100.0 - radius, 10.0, radius);
   CGPathCloseSubpath(path);

   // Then use it in your draw commands
   CGContextSetStrokeColor(context, CGColorGetComponents(strokeColor));
   CGContextSetFillColor(context, CGColorGetComponents(fillColor));
   CGContextSetLineJoin(context, kCGLineJoinMiter);
   CGContextSetLineWidth(context, strokeWidth);

   CGContextAddPath(context, path);
   CGContextDrawPath(context, kCGPathFillStroke);
   CGPathRelease(path); 

и т. Д.,Вы можете освободить путь в конце, если хотите, или оставить ссылку для дальнейшего использования.

5 голосов
/ 23 февраля 2012

Эти две строки отвечают за начальную и конечную точки:

CGContextMoveToPoint(context, 10, 10);    // This sets up the start point
CGContextAddLineToPoint(context, 100, 50); // This moves to the end point.

Регулируя эти две точки x, y, вы можете настроить линию. Длина линии зависит от начальной и конечной точек.

Исходя из ответа psoft - вот базовый пример проекта рисования, включая создание пути и его обводку.

Это объяснено более подробно с большим количеством примеров кода в руководстве по Quartz 2D для путей .

...