<wbr><wbr><wbr>// Drawing with a white stroke color</wbr></wbr></wbr>
CGContextSetRGBStrokeCol<wbr>or<span style="word-wrap:normal; word-break:normal; line-height:21px">(context,</span><span style="word-wrap:normal; word-break:normal; line-height:21px">1.0</span><span style="word-wrap:normal; word-break:normal; line-height:21px">,</span><span style="word-wrap:normal; word-break:normal; line-height:21px">1.0</span><span style="word-wrap:normal; word-break:normal; line-height:21px">,</span><span style="word-wrap:normal; word-break:normal; line-height:21px">1.0</span><span style="word-wrap:normal; word-break:normal; line-height:21px">,</span><span style="word-wrap:normal; word-break:normal; line-height:21px">1.0</span><span style="word-wrap:normal; word-break:normal; line-height:21px">);</span></wbr>
// And draw with a blue fill color
CGContextSetRGBFillColor<wbr><span style="word-wrap:normal; word-break:normal; line-height:21px">(context,</span><span style="word-wrap:normal; word-break:normal; line-height:21px">0.0</span><span style="word-wrap:normal; word-break:normal; line-height:21px">,</span><span style="word-wrap:normal; word-break:normal; line-height:21px">0.0</span><span style="word-wrap:normal; word-break:normal; line-height:21px">,</span><span style="word-wrap:normal; word-break:normal; line-height:21px">1.0</span><span style="word-wrap:normal; word-break:normal; line-height:21px">,</span><span style="word-wrap:normal; word-break:normal; line-height:21px">1.0</span><span style="word-wrap:normal; word-break:normal; line-height:21px">);</span></wbr>
// Draw them with a 2.0 stroke width so they are a bit more visible.
CGContextSetLineWidth(context,2.0);
<wbr></wbr>
// Add an ellipse circumscribed in the given rect to the current path, then stroke it
CGContextAddEllipseInRec<wbr>t<span style="word-wrap:normal; word-break:normal; line-height:21px">(context,</span>CGRectMake<span style="word-wrap:normal; word-break:normal; line-height:21px">(</span><span style="word-wrap:normal; word-break:normal; line-height:21px">30.0</span><span style="word-wrap:normal; word-break:normal; line-height:21px">,</span><span style="word-wrap:normal; word-break:normal; line-height:21px">30.0</span><span style="word-wrap:normal; word-break:normal; line-height:21px">,</span><span style="word-wrap:normal; word-break:normal; line-height:21px">60.0</span><span style="word-wrap:normal; word-break:normal; line-height:21px">,</span><span style="word-wrap:normal; word-break:normal; line-height:21px">60.0</span><span style="word-wrap:normal; word-break:normal; line-height:21px">));</span></wbr>
CGContextStrokePath(context);
<wbr></wbr>
// Stroke ellipse convenience that is equivalent to AddEllipseInRect(); StrokePath();
CGContextStrokeEllipseIn<wbr>Rect<span style="word-wrap:normal; word-break:normal; line-height:21px">(context,</span>CGRectMake<span style="word-wrap:normal; word-break:normal; line-height:21px">(</span><span style="word-wrap:normal; word-break:normal; line-height:21px">30.0</span><span style="word-wrap:normal; word-break:normal; line-height:21px">,</span><span style="word-wrap:normal; word-break:normal; line-height:21px">120.0</span><span style="word-wrap:normal; word-break:normal; line-height:21px">,</span><span style="word-wrap:normal; word-break:normal; line-height:21px">60.0</span><span style="word-wrap:normal; word-break:normal; line-height:21px">,</span><span style="word-wrap:normal; word-break:normal; line-height:21px">60.0</span><span style="word-wrap:normal; word-break:normal; line-height:21px">));</span></wbr>
<wbr></wbr>
// Fill rect convenience equivalent to AddEllipseInRect(); FillPath();
CGContextFillEllipseInRe<wbr>ct<span style="word-wrap:normal; word-break:normal; line-height:21px">(context,</span>CGRectMake<span style="word-wrap:normal; word-break:normal; line-height:21px">(</span><span style="word-wrap:normal; word-break:normal; line-height:21px">30.0</span><span style="word-wrap:normal; word-break:normal; line-height:21px">,</span><span style="word-wrap:normal; word-break:normal; line-height:21px">210.0</span><span style="word-wrap:normal; word-break:normal; line-height:21px">,</span><span style="word-wrap:normal; word-break:normal; line-height:21px">60.0</span><span style="word-wrap:normal; word-break:normal; line-height:21px">,</span><span style="word-wrap:normal; word-break:normal; line-height:21px">60.0</span><span style="word-wrap:normal; word-break:normal; line-height:21px">));</span></wbr>
<wbr></wbr>
// 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);
<wbr></wbr>
// Stroke an arc using AddArcToPoint
CGPointp[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);
<wbr></wbr>
// Show the two segments that are used to determine the tangent lines to draw the arc.
CGContextSetRGBStrokeCol<wbr>or<span style="word-wrap:normal; word-break:normal; line-height:21px">(context,</span><span style="word-wrap:normal; word-break:normal; line-height:21px">1.0</span><span style="word-wrap:normal; word-break:normal; line-height:21px">,</span><span style="word-wrap:normal; word-break:normal; line-height:21px">0.0</span><span style="word-wrap:normal; word-break:normal; line-height:21px">,</span><span style="word-wrap:normal; word-break:normal; line-height:21px">0.0</span><span style="word-wrap:normal; word-break:normal; line-height:21px">,</span><span style="word-wrap:normal; word-break:normal; line-height:21px">1.0</span><span style="word-wrap:normal; word-break:normal; line-height:21px">);</span></wbr>
CGContextAddLines(context, p,sizeof(p)/sizeof(p[0]));
CGContextStrokePath(context);
<wbr></wbr>
// As a bonus, we'll combine arcs to create a round rectangle!
<wbr></wbr>
// Drawing with a white stroke color
CGContextSetRGBStrokeCol<wbr>or<span style="word-wrap:normal; word-break:normal; line-height:21px">(context,</span><span style="word-wrap:normal; word-break:normal; line-height:21px">1.0</span><span style="word-wrap:normal; word-break:normal; line-height:21px">,</span><span style="word-wrap:normal; word-break:normal; line-height:21px">1.0</span><span style="word-wrap:normal; word-break:normal; line-height:21px">,</span><span style="word-wrap:normal; word-break:normal; line-height:21px">1.0</span><span style="word-wrap:normal; word-break:normal; line-height:21px">,</span><span style="word-wrap:normal; word-break:normal; line-height:21px">1.0</span><span style="word-wrap:normal; word-break:normal; line-height:21px">);</span></wbr>
// 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.
CGRectrrect =CGRectMake(210.0,90.0,60.0,60.0);
CGFloatradius =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.
<wbr></wbr>
// 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.
<wbr></wbr>
// 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.
CGFloatminx =CGRectGetMinX(rrect), midx =CGRectGetMidX(rrect), maxx =CGRectGetMaxX(rrect);
CGFloatminy =CGRectGetMinY(rrect), midy =CGRectGetMidY(rrect), maxy =CGRectGetMaxY(rrect);
<wbr></wbr>
// Next, we will go around the rectangle in the order given by the figure below.
// <wbr><wbr><wbr>minx<wbr><wbr>midx<wbr><wbr>maxx</wbr></wbr></wbr></wbr></wbr></wbr></wbr>
// miny<wbr><wbr>2 <wbr><wbr><wbr>3 <wbr><wbr><wbr>4</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>
// midy <wbr>1 9<wbr><wbr><wbr><wbr><wbr><wbr><wbr>5</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>
// maxy<wbr><wbr>8 <wbr><wbr><wbr>7 <wbr><wbr><wbr>6</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>
// 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.
<wbr></wbr>
// 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);
<wbr><wbr><wbr>// Stroke 2 seperate arcs</wbr></wbr></wbr>
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);
<wbr><wbr><wbr>// Stroke 2 arcs together going opposite directions.</wbr></wbr></wbr>
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);
<wbr><wbr><wbr>// Stroke an arc using AddArcToPoint</wbr></wbr></wbr>
CGPointp[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);
<wbr></wbr>
// Show the two segments that are used to determine the tangent lines to draw the arc.
CGContextSetRGBStrokeCol<wbr>or<span style="word-wrap:normal; word-break:normal; line-height:21px">(context,</span><span style="word-wrap:normal; word-break:normal; line-height:21px">1.0</span><span style="word-wrap:normal; word-break:normal; line-height:21px">,</span><span style="word-wrap:normal; word-break:normal; line-height:21px">0.0</span><span style="word-wrap:normal; word-break:normal; line-height:21px">,</span><span style="word-wrap:normal; word-break:normal; line-height:21px">0.0</span><span style="word-wrap:normal; word-break:normal; line-height:21px">,</span><span style="word-wrap:normal; word-break:normal; line-height:21px">1.0</span><span style="word-wrap:normal; word-break:normal; line-height:21px">);</span></wbr>
CGContextAddLines(context, p,sizeof(p)/sizeof(p[0]));
CGContextStrokePath(context);
<wbr><wbr><wbr>CGContextSetRGBStrokeCol<wbr>or<span style="word-wrap:normal; word-break:normal; line-height:21px">(context,</span><span style="word-wrap:normal; word-break:normal; line-height:21px">1.0</span><span style="word-wrap:normal; word-break:normal; line-height:21px">,</span><span style="word-wrap:normal; word-break:normal; line-height:21px">1.0</span><span style="word-wrap:normal; word-break:normal; line-height:21px">,</span><span style="word-wrap:normal; word-break:normal; line-height:21px">1.0</span><span style="word-wrap:normal; word-break:normal; line-height:21px">,</span><span style="word-wrap:normal; word-break:normal; line-height:21px">1.0</span><span style="word-wrap:normal; word-break:normal; line-height:21px">);</span></wbr></wbr></wbr></wbr>
CGRectrrect =CGRectMake(210.0,90.0,60.0,60.0);
CGFloatradius =10.0;
<wbr><wbr><wbr><wbr></wbr></wbr></wbr></wbr>CGFloatminx =CGRectGetMinX(rrect), midx =CGRectGetMidX(rrect), maxx =CGRectGetMaxX(rrect);
<wbr><wbr><wbr><wbr><wbr></wbr></wbr></wbr></wbr></wbr>CGFloatminy =CGRectGetMinY(rrect), midy =CGRectGetMidY(rrect), maxy =CGRectGetMaxY(rrect);
<wbr></wbr>
// 下面代码的绘制路线如下所示了:
// <wbr><wbr><wbr>minx<wbr><wbr>midx<wbr><wbr>maxx</wbr></wbr></wbr></wbr></wbr></wbr></wbr>
// miny<wbr><wbr>2 <wbr><wbr><wbr>3 <wbr><wbr><wbr>4</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>
// midy <wbr>1 9<wbr><wbr><wbr><wbr><wbr><wbr><wbr>5</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>
// maxy<wbr><wbr>8 <wbr><wbr><wbr>7 <wbr><wbr><wbr>6</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>
// 本例中开始点和结束点一样只是一个巧合,所以,我们在最后最好要加上CGContextClosePath
<wbr></wbr>
// 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<wbr>or<span style="word-wrap:normal; word-break:normal; line-height:21px">(context,</span><span style="word-wrap:normal; word-break:normal; line-height:21px">1.0</span><span style="word-wrap:normal; word-break:normal; line-height:21px">,</span><span style="word-wrap:normal; word-break:normal; line-height:21px">1.0</span><span style="word-wrap:normal; word-break:normal; line-height:21px">,</span><span style="word-wrap:normal; word-break:normal; line-height:21px">1.0</span><span style="word-wrap:normal; word-break:normal; line-height:21px">,</span><span style="word-wrap:normal; word-break:normal; line-height:21px">1.0</span><span style="word-wrap:normal; word-break:normal; line-height:21px">);</span></wbr>
// Draw them with a 2.0 stroke width so they are a bit more visible.
CGContextSetLineWidth(context,2.0);
<wbr></wbr>
// Draw a bezier curve with end points s,e and control points cp1,cp2
CGPoints =CGPointMake(30.0,120.0);
CGPointe =CGPointMake(300.0,120.0);
CGPointcp1 =CGPointMake(120.0,30.0);
CGPointcp2 =CGPointMake(210.0,210.0);
CGContextMoveToPoint(context, s.x, s.y);
CGContextAddCurveToPoint<wbr></wbr>(context, cp1.x, cp1.y, cp2.x, cp2.y, e.x, e.y);
CGContextStrokePath(context);
<wbr></wbr>
// Show the control points.
CGContextSetRGBStrokeCol<wbr>or<span style="word-wrap:normal; word-break:normal; line-height:21px">(context,</span><span style="word-wrap:normal; word-break:normal; line-height:21px">1.0</span><span style="word-wrap:normal; word-break:normal; line-height:21px">,</span><span style="word-wrap:normal; word-break:normal; line-height:21px">0.0</span><span style="word-wrap:normal; word-break:normal; line-height:21px">,</span><span style="word-wrap:normal; word-break:normal; line-height:21px">0.0</span><span style="word-wrap:normal; word-break:normal; line-height:21px">,</span><span style="word-wrap:normal; word-break:normal; line-height:21px">1.0</span><span style="word-wrap:normal; word-break:normal; line-height:21px">);</span></wbr>
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);
<wbr></wbr>
// Draw a quad curve with end points s,e and control point cp1
CGContextSetRGBStrokeCol<wbr>or<span style="word-wrap:normal; word-break:normal; line-height:21px">(context,</span><span style="word-wrap:normal; word-break:normal; line-height:21px">1.0</span><span style="word-wrap:normal; word-break:normal; line-height:21px">,</span><span style="word-wrap:normal; word-break:normal; line-height:21px">1.0</span><span style="word-wrap:normal; word-break:normal; line-height:21px">,</span><span style="word-wrap:normal; word-break:normal; line-height:21px">1.0</span><span style="word-wrap:normal; word-break:normal; line-height:21px">,</span><span style="word-wrap:normal; word-break:normal; line-height:21px">1.0</span><span style="word-wrap:normal; word-break:normal; line-height:21px">);</span></wbr>
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<wbr>oint</wbr>(context, cp1.x, cp1.y, e.x, e.y);
CGContextStrokePath(context);
// Show the control point.
CGContextSetRGBStrokeCol<wbr>or<span style="word-wrap:normal; word-break:normal; line-height:21px">(context,</span><span style="word-wrap:normal; word-break:normal; line-height:21px">1.0</span><span style="word-wrap:normal; word-break:normal; line-height:21px">,</span><span style="word-wrap:normal; word-break:normal; line-height:21px">0.0</span><span style="word-wrap:normal; word-break:normal; line-height:21px">,</span><span style="word-wrap:normal; word-break:normal; line-height:21px">0.0</span><span style="word-wrap:normal; word-break:normal; line-height:21px">,</span><span style="word-wrap:normal; word-break:normal; line-height:21px">1.0</span><span style="word-wrap:normal; word-break:normal; line-height:21px">);</span></wbr>
CGContextMoveToPoint(context, s.x, s.y);
CGContextAddLineToPoint(context, cp1.x, cp1.y);
CGContextStrokePath(context);