基本步驟就是:
1、獲取當(dāng)前繪圖上下文
2、設(shè)置筆觸顏色
3、設(shè)置筆觸寬度
4、設(shè)置填充顏色
5、然后就開始繪制了(當(dāng)然也是最復(fù)雜的地方了)
舉個(gè)??
class CircleImage: UIView {
override func drawRect(rect: CGRect) {
// Drawing code
super.drawRect(rect)
let ctx = UIGraphicsGetCurrentContext()
// 設(shè)置筆觸顏色
CGContextSetStrokeColorWithColor(ctx, UIColor.blackColor().CGColor)
// 設(shè)置筆觸寬度
CGContextSetLineWidth(ctx, 2)
// 設(shè)置填充色
CGContextSetFillColorWithColor(ctx, UIColor.purpleColor().CGColor)
CGContextSetLineJoin(ctx, .Round)
CGContextSetLineCap(ctx, .Round)
guard ctx != nil else {
return
}
// drawLine(ctx!)
drawCircle(ctx!)
}
假設(shè)現(xiàn)在要繪制一個(gè)圓,下面我們來(lái)實(shí)現(xiàn)這個(gè)drawCirlce
func drawCircle(ctx: CGContextRef) {
// 第一種方式 在點(diǎn)(100,100)出繪制一個(gè)半徑為50的圓弧,角度從0到2pi,已順時(shí)針?lè)较?,這個(gè)最容易理解,不解釋。
CGContextAddArc(ctx, 100, 100, 50, 0, CGFloat(M_PI), 1)
CGContextFillPath(ctx)
CGContextStrokePath(ctx) // 該代碼無(wú)效了
// 第二種方式 ,設(shè)置起始點(diǎn)在(100,100),然后在繪制4段弧,分別是上左,上右,下右,下左,湊在一起實(shí)際上就是一個(gè)圓。這個(gè)就一批人放棄了
// 因此需要解釋一下,我們只需要在UIKit坐標(biāo)系中,(注意是UIKit坐標(biāo)系)繪制出(100,100),(100,50),(150,20)這三個(gè)點(diǎn),
// 然后依次連接起來(lái),顯然就形成了一個(gè)舉行的左上角形狀了,
// 然后想象一個(gè)半徑為50的圓從矩形的中心慢慢移動(dòng)到矩形的左上角,等到擬合停止,上左段圓弧就出來(lái)了。
// 依次。。4段圓弧都出來(lái)就是一個(gè)圓了
// 那么問(wèn)題來(lái)了,如果半徑改為25,會(huì)出現(xiàn)什么圖形,自己腦補(bǔ),不會(huì)腦補(bǔ)就修改跑一下代碼好嗎?
CGContextMoveToPoint(ctx, 100, 100);
CGContextAddArcToPoint(ctx, 100, 50, 150, 50, 50);
CGContextAddArcToPoint(ctx, 200, 50, 200, 100, 50)
CGContextAddArcToPoint(ctx, 200, 150, 150, 150, 50)
CGContextAddArcToPoint(ctx, 100, 150, 100, 100, 50)
CGContextStrokePath(ctx);
// CGContextFillPath(ctx)
// 第三種方式,放一個(gè)矩形區(qū)域在那里,你在里面塞一個(gè)最大的橢圓出來(lái),當(dāng)矩形寬高相等,顯然,就是一個(gè)正圓了
CGContextAddEllipseInRect(ctx, CGRectMake(200, 50 + 25, 50, 50))
CGContextStrokePath(ctx);
// 第四種方式,三階貝塞爾曲線抱歉,我并沒有畫出一個(gè)圓來(lái),數(shù)學(xué)能力有限,實(shí)際上 繪制出來(lái)的是一個(gè)橢圓而已
CGContextMoveToPoint(ctx, 200, 200);
CGContextAddCurveToPoint(ctx, 200, 100, 300, 100, 300, 200)
CGContextAddCurveToPoint(ctx, 300, 300, 200, 300, 200, 200)
CGContextStrokePath(ctx);
// 第五種方式,二階貝塞爾曲線,抱歉,我依然沒有畫出一個(gè)圓來(lái),數(shù)學(xué)能力有限,實(shí)際上 繪制出來(lái)的是一個(gè)橄欖球
CGContextMoveToPoint(ctx, 100, 300);
CGContextAddQuadCurveToPoint(ctx, 200, 200, 300, 300)
CGContextAddQuadCurveToPoint(ctx, 200, 400, 100, 300)
CGContextStrokePath(ctx);
// 大家喜歡吃??,我就用二階貝塞爾曲線繪制一個(gè)??吧,雖然比較簡(jiǎn)單,但是好像而已蠻像的,
CGContextMoveToPoint(ctx, 200, 400);
CGContextAddQuadCurveToPoint(ctx, 250, 355, 300, 400)
CGContextAddQuadCurveToPoint(ctx, 250, 755, 200, 400)
CGContextStrokePath(ctx);
}
運(yùn)行后效果圖

效果圖.png
總結(jié)及問(wèn)題
本文介紹了使用swift繪圖相關(guān)的一些知識(shí),然后用繪制圓形的各種方式來(lái)舉例子說(shuō)明如何繪圖。
那么問(wèn)題來(lái)了?
- drawRect是一個(gè)不被建議使用的api,為什么我們還是要用?為什么不推薦使用
- 如果要你繪制一個(gè)圓角矩形,你如何做?
- 如何繪制圓形圖片?
- 如何給繪制的圓形圖片加上border?
- CGContextFillPath(ctx); CGContextStrokePath(ctx) // 該代碼無(wú)效了,為什么后面一句代碼無(wú)效?