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);
и т. Д.,Вы можете освободить путь в конце, если хотите, или оставить ссылку для дальнейшего использования.