iOS上使用Quartz 2D繪製簡單圖形

    繪製圖形是通過重載UIView的- (void)drawRect:(CGRect)rect方法來實現的,所以首先需要一個繼承自UIView的類,然後重寫這個類的- (void)drawRect:(CGRect)rect方法。當我們使用這個類的對象時,view顯示時回調自身的drawRect方法,從而把我們會繪製在view上的東西呈現出來。drawRect方法只有一個CGRect 參數傳入,這個值是view的frame。

   1、繪製直線:

CGContextRef context = UIGraphicsGetCurrentContext();  //首先構建一個context,所有繪製都需要的
        CGContextSetLineWidth(context, 2.0);  //設置線條的寬度
        CGContextSetStrokeColorWithColor(context, [UIColor brownColor].CGColor); //設置線條的顏色
        
        CGContextMoveToPoint(context, 10, 10);     //移動到某個點
        CGContextAddLineToPoint(context, CGRectGetMaxX(rect)-10, 10); //添加一條線,後兩個參數提供一個新的點的座標,結合上面的點,構成一條線段的兩端。
        
        CGContextStrokePath(context);   //最後,繪製整個路徑,前面的一系列移動、添加線條、點之類的可以說提供了一個路徑,然後通過這個方法,把路徑繪製出來。
   context,我的理解中,它是一個配置參數的集合,比如線條顏色、線條寬度,一直繪製過程的整個路徑都包含在裏面,它貫通了整個繪製的過程,把各個參數結合到一起。

   而繪製的過程,其實很形象,比如上面繪製線段,可以想象是一支筆,先移動到點(10,10),然後移動到(CGRectGetMaxX(rect)-10, 10),但是方法是AddLine,也就是這個從一個點到另一個點得過程是構成一條線段的,就像是說你是按直線畫過去的。

  2、繪製矩形:

   使用上面的繪製線段的方法當然可以拼接出一個矩形,但是矩形也有單獨的方法。

CGContextRef context = UIGraphicsGetCurrentContext();
        CGContextSetLineWidth(context, 2.0);
        CGContextSetStrokeColorWithColor(context, [UIColor brownColor].CGColor);
        
        CGContextAddRect(context, CGRectMake(10, 10, CGRectGetWidth(rect)-20, CGRectGetHeight(rect)-20));//就這一句話可以了,傳入一個CGRect類型變量,提供矩形的範圍,按這個範圍畫出矩形。
        
        CGContextStrokePath(context);
  3、繪製橢圓:
<span style="font-size:14px;">CGContextRef context = UIGraphicsGetCurrentContext();
        CGContextSetLineWidth(context, 2.0);
        CGContextSetStrokeColorWithColor(context, [UIColor brownColor].CGColor);
        
        CGContextAddEllipseInRect(context, CGRectMake(10, 10, CGRectGetWidth(rect)-20, CGRectGetHeight(rect)-100));</span><pre name="code" class="objc"><span style="font-size:14px;">//這個方法同樣只提供了一個CGRect變量,也就是一個矩形區域,繪製出的橢圓和這個矩形四邊相切。</span><span style="font-family: Arial, Helvetica, sans-serif;"><span style="font-size:12px;">橢圓的形狀靠長短軸的大小可以確定下來,矩形的長寬提供了,而矩形的中心確定了橢圓的中心,這樣橢圓就可以確定下來了。</span></span>
CGContextStrokePath(context);

4、繪製圓形:
CGContextRef context = UIGraphicsGetCurrentContext();
        CGContextSetLineWidth(context, 2.0);
        CGContextSetStrokeColorWithColor(context, [UIColor brownColor].CGColor);
        CGContextAddArc(context, 160, 200, 100, M_PI/3.0, M_PI/2.0, 1);//繪製圓弧

        CGContextStrokePath(context);

CGContextAddArc 方法實際是一個繪製圓弧的方法,第一個參數傳入context,第二個和第三個參數構成圓弧圓心的座標,第四個參數是圓弧的半徑,第五個參數是圓弧的開始角度,第六個參數是圓弧的結束角度,最後一個參數用來指定圓弧的方向,原本傳入0是逆時針、1是順時針,但是因爲Quartz 2D的座標系和UIView的座標系是y軸相反的,所以1是逆時針、0是順時針。跳幀傳入的起始、結束角度可以畫出完整的圓。

繪製圓弧還有一個方法:

CGContextMoveToPoint(context, 10, 10);  //提供一個當前所在點
        CGContextAddArcToPoint(context, 10, 160, 40, 160,100);//繪製圓弧

這裏的思路是,首先有三個點,假設爲A,B,C,然後連接A,B構成一條線,B,C連接構成另一條線,而且兩線交於B點,然後就畫一個圓弧分別與兩條線相切,並且半徑等於指定的半徑。所以需要3個點和一個半徑。CGContextAddArcToPoint這個方法第二個和第三個參數提供一點B的座標,第三個和第四個提供點C的座標,而這是需要一個點A,當前點就是點A,所以需要一個當前點。

5、貝塞爾曲線:

 CGContextAddCurveToPoint(CGContextRef c, CGFloat cp1x,
  CGFloat cp1y, CGFloat cp2x, CGFloat cp2y, CGFloat x, CGFloat y)
貝塞爾曲線需要提供四個點,曲線的兩個端點以及分別靠近兩個端點的兩個控制點,同樣在調用這個繪製曲線的方法時,也需要有一個當前點,這個當前點會作爲曲線的一個端點。方法最後兩個參數構成另外一個端點的座標。然後第二、第三和第四、第五個參數分別構成兩個控制點。控制點並不處在曲線上。通過調節控制點,可以調節曲線的樣式,從而滿足對於各種曲線的要求。

6、繪製虛線:

CGContextRef context = UIGraphicsGetCurrentContext();
        CGContextSetLineWidth(context, 2.0);
        const CGFloat lengths[] = {16.0f,6.0f,30.0f,40.0f};
        CGContextSetLineDash(context, 0, lengths, 4); //設置虛線的樣式
        CGContextSetStrokeColorWithColor(context, [UIColor brownColor].CGColor);
        
        CGContextAddRect(context, CGRectMake(10, 10, CGRectGetWidth(rect)-20, CGRectGetHeight(rect)-20));
        
        CGContextStrokePath(context);
這裏使用虛線繪製了一個矩形,虛線其實只需設置線條的屬性即可,和上面說的圖形繪製是兩個不同方面的問題,可以同時使用。 對於虛線,關鍵的方法是CGContextSetLineDash,定義爲:
void CGContextSetLineDash (
   CGContextRef c,
   CGFloat phase,
   const CGFloat lengths[],
   size_t count
);
lengths是一個float類型數組,count是數組裏元素的數量。lengths指出了虛線的樣式,例如
{16.0f,6.0f,30.0f,40.0f}
就是先長度爲16的實線,然後空長度6,再是長度30的實線,再是空缺40長度,然後循環這個過程。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章