繪製圖形是通過重載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長度,然後循環這個過程。