一、qurza2d是怎麼將繪圖信息和繪圖的屬性繪制到圖形上下文中去的?
說明:
新建一個項目,自定義一個view類和storyboard關聯後,重寫該類中的drowrect方法。 畫線的三個步驟: (1)獲取上下文 (2)繪圖 (3)渲染 要求:畫兩條單獨的線 代碼和效果圖:1 - (void)drawRect:(CGRect)rect 2 { 3 //獲取上下文 4 CGContextRef ctx=UIGraphicsGetCurrentContext(); 5 //繪圖 6 //第一條線 7 CGContextMoveToPoint(ctx, 20, 100); 8 CGContextAddLineToPoint(ctx, 100, 320); 9 10 //第二條線 11 CGContextMoveToPoint(ctx, 40, 200); 12 CGContextAddLineToPoint(ctx, 80, 100); 13 //渲染 14 CGContextStrokePath(ctx); 15 16 }效果圖:
1 - (void)drawRect:(CGRect)rect 2 { 3 //獲取上下文 4 CGContextRef ctx=UIGraphicsGetCurrentContext(); 5 //繪圖 6 //第一條線 7 CGContextMoveToPoint(ctx, 20, 100); 8 CGContextAddLineToPoint(ctx, 100, 320); 9 10 //設置第一條線的狀態 11 //設置線條的寬度 12 CGContextSetLineWidth(ctx, 12); 13 //設置線條的顏色 14 [[UIColor brownColor]set]; 15 //設置線條兩端的樣式為圓角 16 CGContextSetLineCap(ctx,kCGLineCapRound); 17 //對線條進行渲染 18 CGContextStrokePath(ctx); 19 20 //第二條線 21 CGContextMoveToPoint(ctx, 40, 200); 22 CGContextAddLineToPoint(ctx, 80, 100); 23 //渲染 24 CGContextStrokePath(ctx); 25 26 }
效果圖:
新的需求:要讓兩條線的顏色不一樣,要求第二條線變成原版的樣子。要達到上面的要求,有以下幾種做法:
第一種做法: 在對第二條線進行設置的時候,清空它的狀態1 - (void)drawRect:(CGRect)rect 2 { 3 //獲取上下文 4 CGContextRef ctx=UIGraphicsGetCurrentContext(); 5 //繪圖 6 //第一條線 7 CGContextMoveToPoint(ctx, 20, 100); 8 CGContextAddLineToPoint(ctx, 100, 320); 9 10 //設置第一條線的狀態 11 //設置線條的寬度 12 CGContextSetLineWidth(ctx, 12); 13 //設置線條的顏色 14 [[UIColor brownColor]set]; 15 //設置線條兩端的樣式為圓角 16 CGContextSetLineCap(ctx,kCGLineCapRound); 17 //對線條進行渲染 18 CGContextStrokePath(ctx); 19 20 //第二條線 21 CGContextMoveToPoint(ctx, 40, 200); 22 CGContextAddLineToPoint(ctx, 80, 100); 23 24 //清空狀態 25 CGContextSetLineWidth(ctx, 1); 26 [[UIColor blackColor]set]; 27 CGContextSetLineCap(ctx,kCGLineCapButt); 28 29 //渲染 30 CGContextStrokePath(ctx); 31 32 }第二種做法: 把第一條線從開始繪制到渲染的代碼剪切到第二條線渲染完成之後,這樣先繪制並渲染了第一條線,該線並沒有對繪制信息進行過設置,顯示出來的第二條線即位系統默認的效果。
1 - (void)drawRect:(CGRect)rect 2 { 3 //獲取上下文 4 CGContextRef ctx=UIGraphicsGetCurrentContext(); 5 //繪圖 6 7 //第二條線 8 CGContextMoveToPoint(ctx, 40, 200); 9 CGContextAddLineToPoint(ctx, 80, 100); 10 11 //清空狀態 12 // CGContextSetLineWidth(ctx, 1); 13 // [[UIColor blackColor]set]; 14 15 // CGContextSetLineCap(ctx,kCGLineCapButt); 16 17 //渲染 18 CGContextStrokePath(ctx); 19 20 //第一條線 21 CGContextMoveToPoint(ctx, 20, 100); 22 CGContextAddLineToPoint(ctx, 100, 320); 23 24 //設置第一條線的狀態 25 //設置線條的寬度 26 CGContextSetLineWidth(ctx, 12); 27 //設置線條的顏色 28 [[UIColor brownColor]set]; 29 //設置線條兩端的樣式為圓角 30 CGContextSetLineCap(ctx,kCGLineCapRound); 31 //對線條進行渲染 32 CGContextStrokePath(ctx); 33 }
兩種方式完成的效果相同:
1 - (void)drawRect:(CGRect)rect 2 { 3 //獲取上下文 4 CGContextRef ctx=UIGraphicsGetCurrentContext(); 5 //繪圖 6 //第一條線 7 CGContextMoveToPoint(ctx, 20, 100); 8 CGContextAddLineToPoint(ctx, 100, 320); 9 10 //設置第一條線的狀態 11 //設置線條的寬度 12 CGContextSetLineWidth(ctx, 12); 13 //設置線條的顏色 14 [[UIColor brownColor]set]; 15 //設置線條兩端的樣式為圓角 16 CGContextSetLineCap(ctx,kCGLineCapRound); 17 //對線條進行渲染 18 CGContextStrokePath(ctx); 19 20 //第二條線 21 CGContextMoveToPoint(ctx, 40, 200); 22 CGContextAddLineToPoint(ctx, 80, 100); 23 //渲染 24 CGContextStrokePath(ctx); 25 }如果清空了狀態,則在渲染之前,在繪制圖形區域對第二條線進行繪制的時候,會去查找當前的繪圖信息(已經更改——清空),根據繪圖信息對第二條線進行繪制,調用渲染方法的時候把第二條線顯示到view上。 參考代碼:
1 - (void)drawRect:(CGRect)rect 2 { 3 //獲取上下文 4 CGContextRef ctx=UIGraphicsGetCurrentContext(); 5 //繪圖 6 //第一條線 7 CGContextMoveToPoint(ctx, 20, 100); 8 CGContextAddLineToPoint(ctx, 100, 320); 9 10 //設置第一條線的狀態 11 //設置線條的寬度 12 CGContextSetLineWidth(ctx, 12); 13 //設置線條的顏色 14 [[UIColor brownColor]set]; 15 //設置線條兩端的樣式為圓角 16 CGContextSetLineCap(ctx,kCGLineCapRound); 17 //對線條進行渲染 18 CGContextStrokePath(ctx); 19 20 //第二條線 21 CGContextMoveToPoint(ctx, 40, 200); 22 CGContextAddLineToPoint(ctx, 80, 100); 23 24 //清空狀態 25 CGContextSetLineWidth(ctx, 1); 26 [[UIColor blackColor]set]; 27 CGContextSetLineCap(ctx,kCGLineCapButt); 28 29 //渲染 30 CGContextStrokePath(ctx); 31 }三、圖形上下文棧 1.簡單說明 在獲取圖形上下文之後,通過
CGContextSaveGState(ctx);
方法,把當前獲取的上下文拷貝一份,保存一份最純潔的圖形上下文。 在畫第二條線之前,使用CGContextRestoreGState(ctx);方法,還原開始的時候保存的那份最純潔的圖形上下文。 代碼:1 - (void)drawRect:(CGRect)rect 2 { 3 //獲取上下文 4 CGContextRef ctx=UIGraphicsGetCurrentContext(); 5 //保存一份最初的圖形上下文 6 CGContextSaveGState(ctx); 7 8 //繪圖 9 //第一條線 10 CGContextMoveToPoint(ctx, 20, 100); 11 CGContextAddLineToPoint(ctx, 100, 320); 12 13 //設置第一條線的狀態 14 //設置線條的寬度 15 CGContextSetLineWidth(ctx, 12); 16 //設置線條的顏色 17 [[UIColor brownColor]set]; 18 //設置線條兩端的樣式為圓角 19 CGContextSetLineCap(ctx,kCGLineCapRound); 20 //對線條進行渲染 21 CGContextStrokePath(ctx); 22 23 //還原開始的時候保存的那份最純潔的圖形上下文 24 CGContextRestoreGState(ctx); 25 //第二條線 26 CGContextMoveToPoint(ctx, 40, 200); 27 CGContextAddLineToPoint(ctx, 80, 100); 28 29 //清空狀態 30 // CGContextSetLineWidth(ctx, 1); 31 // [[UIColor blackColor]set]; 32 // CGContextSetLineCap(ctx,kCGLineCapButt); 33 34 //渲染 35 CGContextStrokePath(ctx); 36 }2.圖形上下文棧機制 畫第一條線的時候,會把當前的圖形上下文拷貝一份保存到圖形上下文棧中。