標籤:
一、繪圖路徑
A.簡單說明在畫線的時候,方法的內部預設建立一個path。它把路徑都放到了path裡面去。1.建立路徑 CGMutablepathref 調用該方法相當於建立了一個路徑,這個路徑用來儲存繪圖資訊。2.把繪圖資訊添加到路徑裡邊。以前的方法是點的位置添加到ctx(圖形上下文資訊)中,ctx 預設會在內部建立一個path用來儲存繪圖資訊。在圖形上下文中有一Block Storage空間專門用來儲存繪圖資訊,其實這塊空間就是CGMutablePathRef。3.把路徑添加到上下文中。程式碼範例: 繪製一條直線的代碼:
1 // 1.擷取圖形上下文2 CGContextRef ctx = UIGraphicsGetCurrentContext();3 // 2.繪圖(畫線)4 // 設定起點5 CGContextMoveToPoint(ctx, 20, 20);6 // 設定終點7 CGContextAddLineToPoint(ctx, 200, 300);8 // 渲染9 CGContextStrokePath(ctx);
上面的代碼和下面的代碼是等價的。
1 // 1.擷取圖形上下文 2 CGContextRef ctx = UIGraphicsGetCurrentContext(); 3 4 // 2.繪圖 5 // 2.1建立一條直線繪圖的路徑 6 // 注意:但凡通過Quartz2D中帶有creat/copy/retain方法建立出來的值都必須要釋放 7 CGMutablePathRef path = CGPathCreateMutable(); 8 // 2.2把繪圖資訊添加到路徑裡 9 CGPathMoveToPoint(path, NULL, 20, 20);10 CGPathAddLineToPoint(path, NULL, 200, 300);11 // 2.3把路徑添加到上下文中12 // 把繪製直線的繪圖資訊儲存到圖形上下文中13 CGContextAddPath(ctx, path);14 15 // 3.渲染16 CGContextStrokePath(ctx);17 18 // 4.釋放前面建立的兩條路徑19 //第一種方法20 CGPathRelease(path);21 //第二種方法22// CFRelease(path);23 }
B.直接使用path的好處:第一種代碼的閱讀性不好,不便於區分。使用path,則一個path就代表一條路徑。比如:如果要在上下文中繪製多個圖形,這種情況下建議使用path。 程式碼範例:
1 - (void)drawRect:(CGRect)rect 2 { 3 // 1.擷取圖形上下文 4 CGContextRef ctx = UIGraphicsGetCurrentContext(); 5 6 // 2.繪圖 7 // 2.a 畫一條直線 8 // 2.a.1建立一條繪圖的路徑 9 // 注意:但凡通過Quartz2D中帶有creat/copy/retain方法建立出來的值都必須要釋放10 CGMutablePathRef path = CGPathCreateMutable();11 12 // 2.a.2把繪圖資訊添加到路徑裡13 CGPathMoveToPoint(path, NULL, 20, 20);14 CGPathAddLineToPoint(path, NULL, 200, 300);15 16 // 2.a.3把路徑添加到上下文中17 // 把繪製直線的繪圖資訊儲存到圖形上下文中18 CGContextAddPath(ctx, path);19 20 21 // 2.b畫一個圓22 // 2.b.1建立一條畫圓的繪圖路徑(注意這裡是可變的,不是CGPathRef)23 CGMutablePathRef path1=CGPathCreateMutable();24 25 //2.b.2把圓的繪圖資訊添加到路徑裡26 CGPathAddEllipseInRect(path1, NULL, CGRectMake(50, 50, 100, 100));27 28 //2.b.3把圓的路徑添加到圖形上下文中29 CGContextAddPath(ctx, path1);30 31 32 //3.渲染33 CGContextStrokePath(ctx);34 35 //4.釋放前面建立的兩條路徑36 //第一種方法37 CGPathRelease(path);38 CGPathRelease(path1);39 //第二種方法40 // CFRelease(path);41 // CFRelease(path1);
42}效果:提示:如果是畫線,那麼就建立一條路徑(path)用來儲存畫線的繪圖資訊,如果又要重新畫一個圓,那麼就可以建立一條新的路徑來專門儲存畫圓的繪圖資訊。 注意:但凡通過quarzt2d中帶有creat/copy/retain方法建立出來的值都必須手動的釋放有兩種方法可以釋放前面建立的路徑:(1)CGPathRelease(path);(2)CFRelease(path);說明:CFRelease屬於更底層的cocafoundation架構
二、補充知識點:畫四邊形的一些方法:第一種方式:通過串連固定的點繪製四邊形第二種方式:指定起點和寬高繪製四邊形第三種方式:把第二種方式中的兩步合并成一步。第四種方式(oc的方法):繪製實心的四邊形,注意沒有空心的方法第五種:畫根線,設定線條的寬度(通過這種方式可以畫斜的四邊形) 程式碼範例:
1 // 2 // YYView.m 3 // 06-四邊形的五種畫法 4 // 5 // Created by apple on 14-6-11. 6 // Copyright (c) 2014年 itcase. All rights reserved. 7 // 8 9 #import "YYView.h"10 11 @implementation YYView12 13 14 - (void)drawRect:(CGRect)rect15 {16 // 擷取圖形上下文17 CGContextRef ctx = UIGraphicsGetCurrentContext();18 // 第一種畫法,通過串連固定的點繪製四邊形19 // CGContextMoveToPoint(ctx, 0, 20);20 // CGContextAddLineToPoint(<#CGContextRef c#>, <#CGFloat x#>, <#CGFloat y#>);21 // CGContextAddLineToPoint(<#CGContextRef c#>, <#CGFloat x#>, <#CGFloat y#>);22 // CGContextAddLineToPoint(<#CGContextRef c#>, <#CGFloat x#>, <#CGFloat y#>);23 24 // 第二種方式:指定起點和寬高繪製四邊形25 // CGContextAddRect(ctx, CGRectMake(20, 20, 200, 100));26 // // 渲染27 // CGContextStrokePath(ctx);28 29 // 第三種方式:二種的兩步合并成一步。30 // 畫空心的四邊形31 // CGContextStrokeRect(ctx, CGRectMake(20, 20, 200, 100));32 // // 畫實心的四邊形33 // CGContextFillRect(ctx, CGRectMake(20, 20, 200, 100));34 35 // 第四種方式(oc的方法):繪製實心的四邊形,注意沒有空心的方法36 UIRectFill(CGRectMake(20, 20, 200, 100));37 38 // 第五種方式:畫根線,設定線條的寬度(通過這種方式可以畫斜的四邊形)39 // CGContextMoveToPoint(ctx, 20, 20);40 // CGContextAddLineToPoint(ctx, 100, 200);41 // CGContextSetLineWidth(ctx, 50);42 // //注意,線條只能畫成是空心的43 // CGContextStrokePath(ctx);44 45 }46 @end
第五種方法可以畫斜的四邊形。
iOS開發UI篇—Quartz2D使用(繪圖路徑)