繪圖的完整過程
程序啟動委可,顯示自定義的view晓猛。當程序第一次顯示在我們眼前的時候,程序會調(diào)用drawRect:方法誉己,在里面獲取了圖形上下文(在內(nèi)存中擁有了),然后利用圖形上下文保存繪圖信息久又,可以理解為圖形上下文中有一塊區(qū)域用來保存繪圖信息巫延,有一塊區(qū)域用來保存繪圖的狀態(tài)(線寬,圓角地消,顏色)炉峰。直線不是直接繪制到view上的,可以理解為在圖形上下文中有一塊單獨的區(qū)域用來先繪制圖形脉执,當調(diào)用渲染方法的時候疼阔,再把繪制好的圖形顯示到view上去。
在繪制圖形區(qū)域,會去保存繪圖狀態(tài)區(qū)域中查找對應(yīng)的狀態(tài)信息(線寬婆廊,圓角迅细,顏色),然后在繪圖區(qū)域把對第一條直線繪制完成淘邻。其實在渲染之前茵典,就已經(jīng)把直線在繪制圖形區(qū)域畫好了。
調(diào)用渲染方法的時候宾舅,把繪制圖形區(qū)域已經(jīng)畫好的圖形直接顯示到view上统阿,就是我們看到的樣子了。
畫第二條的時候筹我,如果沒有對繪圖狀態(tài)進行重新設(shè)置扶平,那么可以發(fā)現(xiàn)畫第一天線的時候使用的繪圖狀態(tài)還保存在圖形上下文中,在第二條線進行渲染之前蔬蕊,會根據(jù)第一條線(上一份繪圖狀態(tài))對第二條線進行相應(yīng)的設(shè)置结澄,渲染后把第二條線顯示到屏幕上。
簡單說明圖形上下文棧
在獲取圖形上下文之后岸夯,通過 CGContextSaveGState(ctx); 方法麻献,把當前獲取的上下文拷貝一份,保存一份最純潔的圖形上下文囱修。
在畫第二條線之前赎瑰,使用CGContextRestoreGState(ctx);方法王悍,還原開始的時候保存的那份最純潔的圖形上下文破镰。
代碼
- (void)drawRect:(CGRect)rect
{
//獲取上下文
CGContextRef ctx=UIGraphicsGetCurrentContext();
//保存一份最初的圖形上下文
CGContextSaveGState(ctx);
//繪圖
//第一條線
CGContextMoveToPoint(ctx, 30, 130);
CGContextAddLineToPoint(ctx, 250, 130);
//設(shè)置第一條線的狀態(tài)
//設(shè)置線條的寬度
CGContextSetLineWidth(ctx, 12);
//設(shè)置線條的顏色
[[UIColor redColor]set];
//設(shè)置線條兩端的樣式為圓角
CGContextSetLineCap(ctx,kCGLineCapRound);
//對線條進行渲染
CGContextStrokePath(ctx);
//還原開始的時候保存的那份最純潔的圖形上下文
CGContextRestoreGState(ctx);
//第二條線
CGContextMoveToPoint(ctx, 160, 30);
CGContextAddLineToPoint(ctx, 160, 200);
//渲染
CGContextStrokePath(ctx);
}