iOS 2D繪圖詳解(Quartz 2D)之路徑(點,直線,虛線,曲線,圓弧,橢圓,矩形)

來源:互聯網
上載者:User

iOS 2D繪圖詳解(Quartz 2D)之路徑(點,直線,虛線,曲線,圓弧,橢圓,矩形)

 

前言:一個路徑可以包含由一個或者多個shape以及子路徑subpath,quartz提供了很多方便的shape可以直接調用。例如:point,line,Arc(圓弧),Curves(曲線),Ellipse(橢圓),矩形(Rectangle).

對這些path可以進行stroke(描邊),也可以進行fill(填充).也可以利用path對一個地區進行截取(clip).

例如,使用截取圓形地區

如果對Quartz的基本概念仍然不清楚的,強烈建議看下我之前的這篇文章,不然不能理解

iOS 2D繪圖詳解(Quartz 2D)之概述

Points/Lines

Quartz中,使用方法CGContextMoveToPoint移動畫筆到一個點來開始新的子路徑,使用CGContextAddLineToPoint來從當前開始點添加一條線到結束點,注意,CGContextAddLineToPoint調用後,開始點會重新設定,這知道結束點

舉個例子

代碼

- (void)drawRect:(CGRect)rect {    CGContextRef context = UIGraphicsGetCurrentContext(); //獲得當前context    //設定顏色    CGContextSetFillColorWithColor(context, [UIColor whiteColor].CGColor);    CGContextSetStrokeColorWithColor(context, [UIColor lightGrayColor].CGColor);    //為了顏色更好區分,對矩形描邊    CGContextFillRect(context, rect);    CGContextStrokeRect(context, rect);    //實際line和point的代碼    CGContextSetStrokeColorWithColor(context, [UIColor redColor].CGColor);// 設定描邊顏色    CGContextSetLineWidth(context, 4.0);//線的寬度    CGContextSetLineCap(context, kCGLineCapRound);//線的頂端    CGContextSetLineJoin(context, kCGLineJoinRound);//線相交的模式    CGContextMoveToPoint(context,10,10);    CGContextAddLineToPoint(context, 40, 40);    CGContextAddLineToPoint(context, 10, 80);    CGContextStrokePath(context);}

這裡提一下線的頂端模式,使用CGContextSetLineCap來設定,一共有三種

線的相交模式,使用CGContextSetLineJoin 來設定,一共也有三種

虛線
效果

代碼

    CGContextSetStrokeColorWithColor(context, [UIColor redColor].CGColor);    CGContextSetLineWidth(context, 1.0);    CGContextSetLineCap(context, kCGLineCapRound);    CGContextSetLineJoin(context, kCGLineJoinRound);    CGFloat lengths[] = {2};    CGContextSetLineDash(context, 1, lengths, 1);    CGContextMoveToPoint(context,10,10);    CGContextAddLineToPoint(context, 40, 40);    CGContextAddLineToPoint(context, 10, 80);    CGContextStrokePath(context);

使用到方法CGContextSetLineDash參數詳解

void CGContextSetLineDash (   CGContextRef _Nullable c,   CGFloat phase,   const CGFloat * _Nullable lengths,   size_t count);
c 繪製的context,這個不用多說 phase,第一個虛線段從哪裡開始,例如傳入3,則從第三個單位開始 lengths,一個C數組,表示繪製部分和空白部分的分配。例如傳入[2,2],則繪製2個單位,然後空白兩個單位,以此重複 count lengths的數量圓弧

Quartz提供了兩個方法來繪製圓弧

CGContextAddArc,普通的圓弧一部分(以某圓心,某半徑,某弧度的圓弧) CGContextAddArcToPoint,用來繪製圓角,下文會詳細闡述

CGContextAddArc參數

void CGContextAddArc (   CGContextRef _Nullable c,   CGFloat x,   CGFloat y,   CGFloat radius,   CGFloat startAngle,   CGFloat endAngle,   int clockwise);
c,context不用剁手 x,y指定座標原點 radius,指定半徑長度 startAngle/endAngle,指定某一段弧度 clockwise,1表示順時針,0表示逆時針
例如
這個函數很簡單,不放圖了
  CGContextAddArc(context,50,50, 25,M_PI_2,M_PI,1);  CGContextStrokePath(context);

CGContextAddArcToPoint這個方法比較複雜,但是理解了也沒那麼難
函數體

void CGContextAddArcToPoint (   CGContextRef _Nullable c,   CGFloat x1,   CGFloat y1,   CGFloat x2,   CGFloat y2,   CGFloat radius);

參數

c context x1,y1和當前點(x0,y0)決定了第一條切線(x0,y0)->(x1,y1) x2,y2和(x1,y1)決定了第二條切線 radius,想切的半徑。

也就是說,
繪製一個半徑為radius的圓弧,和上述 兩條直線都相切。

代碼

    CGContextMoveToPoint(context, 100, 50);    CGContextAddArcToPoint(context,100,0,50,0, 50);    CGContextStrokePath(context);

效果

解釋為什麼

圖中的兩條紅線就是上文提到的兩條線,分別是(x0,y0)->(x1,y1)和(x1,y1)->(x2,y2),那麼和這兩條線都想切的自然就是圖中的藍色圓弧了

橢圓/矩形

比較簡單,這裡不多贅述

樣本

    CGContextSetStrokeColorWithColor(context, [UIColor blueColor].CGColor);    CGContextAddEllipseInRect(context, CGRectMake(10, 10,40, 20));    CGContextAddRect(context, CGRectMake(10, 10,40, 20));    CGContextStrokePath(context);

效果

曲線

Quartz 使用電腦圖形學中的多項式來繪製曲線,支援二次和三次曲線。
利用函數CGContextAddCurveToPoint可以繪製三次曲線,
函數體

void CGContextAddCurveToPoint (   CGContextRef _Nullable c,   CGFloat cp1x,   CGFloat cp1y,   CGFloat cp2x,   CGFloat cp2y,   CGFloat x,   CGFloat y);

參數

c context cp1x,cp1y 第一個控制點 cp2x,cp2y 第二個控制點 x,y 結束點
具體效果

使用方法CGContextAddQuadCurveToPoint 來繪二次曲線,
函數體,

void CGContextAddQuadCurveToPoint (   CGContextRef _Nullable c,   CGFloat cpx,   CGFloat cpy,   CGFloat x,   CGFloat y);

參數

c context cpx,cpy控制點 x,y結束點
效果

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.