CGContextSetRGBStrokeCol
// And draw with a blue fill color
CGContextSetRGBFillColor
// Draw them with a 2.0 stroke width so they are a bit more visible.
CGContextSetLineWidth(context, 2.0);
// Add an ellipse circumscribed in the given rect to the current path, then stroke it
CGContextAddEllipseInRec
CGContextStrokePath(context);
// Stroke ellipse convenience that is equivalent to AddEllipseInRect(); StrokePath();
CGContextStrokeEllipseIn
// Fill rect convenience equivalent to AddEllipseInRect(); FillPath();
CGContextFillEllipseInRe
// Stroke 2 seperate arcs
CGContextAddArc(context, 150.0, 60.0, 30.0, 0.0, M_PI/2.0, false);
CGContextStrokePath(context);
CGContextAddArc(context, 150.0, 60.0, 30.0, 3.0*M_PI/2.0, M_PI, true);
CGContextStrokePath(context);
// Stroke 2 arcs together going opposite directions.
CGContextAddArc(context, 150.0, 150.0, 30.0, 0.0, M_PI/2.0, false);
CGContextAddArc(context, 150.0, 150.0, 30.0, 3.0*M_PI/2.0, M_PI, true);
CGContextStrokePath(context);
// Stroke 2 arcs together going the same direction..
CGContextAddArc(context, 150.0, 240.0, 30.0, 0.0, M_PI/2.0, false);
CGContextAddArc(context, 150.0, 240.0, 30.0, M_PI, 3.0*M_PI/2.0, false);
CGContextStrokePath(context);
// Stroke an arc using AddArcToPoint
CGPoint p[3] =
{
CGPointMake(210.0, 30.0),
CGPointMake(210.0, 60.0),
CGPointMake(240.0, 60.0),
};
CGContextMoveToPoint(context, p[0].x, p[0].y);
CGContextAddArcToPoint(context, p[1].x, p[1].y, p[2].x, p[2].y, 30.0);
CGContextStrokePath(context);
// Show the two segments that are used to determine the tangent lines to draw the arc.
CGContextSetRGBStrokeCol
CGContextAddLines(context, p, sizeof(p)/sizeof(p[0]));
CGContextStrokePath(context);
// As a bonus, we'll combine arcs to create a round rectangle!
// Drawing with a white stroke color
CGContextSetRGBStrokeCol
// If you were making this as a routine, you would probably accept a rectangle
// that defines its bounds, and a radius reflecting the "rounded-ness" of the rectangle.
CGRect rrect = CGRectMake(210.0, 90.0, 60.0, 60.0);
CGFloat radius = 10.0;
// NOTE: At this point you may want to verify that your radius is no more than half
// the width and height of your rectangle, as this technique degenerates for those cases.
// In order to draw a rounded rectangle, we will take advantage of the fact that
// CGContextAddArcToPoint will draw straight lines past the start and end of the arc
// in order to create the path from the current position and the destination position.
// In order to create the 4 arcs correctly, we need to know the min, mid and max positions
// on the x and y lengths of the given rectangle.
CGFloat minx = CGRectGetMinX(rrect), midx = CGRectGetMidX(rrect), maxx = CGRectGetMaxX(rrect);
CGFloat miny = CGRectGetMinY(rrect), midy = CGRectGetMidY(rrect), maxy = CGRectGetMaxY(rrect);
// Next, we will go around the rectangle in the order given by the figure below.
//
// miny
// midy
// maxy
// Which gives us a coincident start and end point, which is incidental to this technique, but still doesn't
// form a closed path, so we still need to close the path to connect the ends correctly.
// Thus we start by moving to point 1, then adding arcs through each pair of points that follows.
// You could use a similar tecgnique to create any shape with rounded corners.
// Start at 1
CGContextMoveToPoint(context, minx, midy);
// Add an arc through 2 to 3
CGContextAddArcToPoint(context, minx, miny, midx, miny, radius);
// Add an arc through 4 to 5
CGContextAddArcToPoint(context, maxx, miny, maxx, midy, radius);
// Add an arc through 6 to 7
CGContextAddArcToPoint(context, maxx, maxy, midx, maxy, radius);
// Add an arc through 8 to 9
CGContextAddArcToPoint(context, minx, maxy, minx, midy, radius);
// Close the path
CGContextClosePath(context);
// Fill & stroke the path
CGContextDrawPath(context, kCGPathFillStroke);
CGContextAddArc(context, 150.0, 60.0, 30.0, 0.0, M_PI/2.0, false);
CGContextStrokePath(context);
CGContextAddArc(context, 150.0, 60.0, 30.0, 3.0*M_PI/2.0, M_PI, true);
CGContextStrokePath(context);
CGContextAddArc(context, 150.0, 150.0, 30.0, 0.0, M_PI/2.0, false);
CGContextAddArc(context, 150.0, 150.0, 30.0, 3.0*M_PI/2.0, M_PI, true);
CGContextStrokePath(context);
// Stroke 2 arcs together going the same direction..
CGContextAddArc(context, 150.0, 240.0, 30.0, 0.0, M_PI/2.0, false);
CGContextAddArc(context, 150.0, 240.0, 30.0, M_PI, 3.0*M_PI/2.0, false);
CGContextStrokePath(context);
CGPoint p[3] =
{
CGPointMake(210.0, 30.0),
CGPointMake(210.0, 60.0),
CGPointMake(240.0, 60.0),
};
CGContextMoveToPoint(context, p[0].x, p[0].y);
CGContextAddArcToPoint(context, p[1].x, p[1].y, p[2].x, p[2].y, 30.0);
CGContextStrokePath(context);
// Show the two segments that are used to determine the tangent lines to draw the arc.
CGContextSetRGBStrokeCol
CGContextAddLines(context, p, sizeof(p)/sizeof(p[0]));
CGContextStrokePath(context);
CGRect rrect = CGRectMake(210.0, 90.0, 60.0, 60.0);
CGFloat radius = 10.0;
// 下面代码的绘制路线如下所示了:
//
// miny
// midy
// maxy
// 本例中开始点和结束点一样只是一个巧合,所以,我们在最后最好要加上CGContextClosePath
// Start at 1
CGContextMoveToPoint(context, minx, midy);
// Add an arc through 2 to 3
CGContextAddArcToPoint(context, minx, miny, midx, miny, radius);
// Add an arc through 4 to 5
CGContextAddArcToPoint(context, maxx, miny, maxx, midy, radius);
// Add an arc through 6 to 7
CGContextAddArcToPoint(context, maxx, maxy, midx, maxy, radius);
// Add an arc through 8 to 9
CGContextAddArcToPoint(context, minx, maxy, minx, midy, radius);
// Close the path
CGContextClosePath(context);
// Fill & stroke the path
CGContextDrawPath(context, kCGPathFillStroke);
// Drawing with a white stroke color
CGContextSetRGBStrokeCol
// Draw them with a 2.0 stroke width so they are a bit more visible.
CGContextSetLineWidth(context, 2.0);
// Draw a bezier curve with end points s,e and control points cp1,cp2
CGPoint s = CGPointMake(30.0, 120.0);
CGPoint e = CGPointMake(300.0, 120.0);
CGPoint cp1 = CGPointMake(120.0, 30.0);
CGPoint cp2 = CGPointMake(210.0, 210.0);
CGContextMoveToPoint(context, s.x, s.y);
CGContextAddCurveToPoint
CGContextStrokePath(context);
// Show the control points.
CGContextSetRGBStrokeCol
CGContextMoveToPoint(context, s.x, s.y);
CGContextAddLineToPoint(context, cp1.x, cp1.y);
CGContextMoveToPoint(context, e.x, e.y);
CGContextAddLineToPoint(context, cp2.x, cp2.y);
CGContextStrokePath(context);
// Draw a quad curve with end points s,e and control point cp1
CGContextSetRGBStrokeCol
s = CGPointMake(30.0, 300.0);
e = CGPointMake(270.0, 300.0);
cp1 = CGPointMake(150.0, 180.0);
CGContextMoveToPoint(context, s.x, s.y);
CGContextAddQuadCurveToP
CGContextStrokePath(context);
// Show the control point.
CGContextSetRGBStrokeCol
CGContextMoveToPoint(context, s.x, s.y);
CGContextAddLineToPoint(context, cp1.x, cp1.y);
CGContextStrokePath(context);