iOS開發UI篇—Quartz2D使用(繪圖路徑)


iOS開發UI篇—Quartz2D使用(繪圖路徑)

一、繪圖路徑

A.簡單說明
在畫線的時候,方法的內部默認創建一個path。它把路徑都放到了path里面去。
1.創建路徑  cgmutablepathref 調用該方法相當於創建了一個路徑,這個路徑用來保存繪圖信息。
2.把繪圖信息添加到路徑里邊。
以前的方法是點的位置添加到ctx(圖形上下文信息)中,ctx 默認會在內部創建一個path用來保存繪圖信息。
在圖形上下文中有一塊存儲空間專門用來存儲繪圖信息,其實這塊空間就是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 }
效果:
提示:如果是畫線,那么就創建一條路徑(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 YYview
12 
13 
14 - (void)drawRect:(CGRect)rect
15 {
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

第五種方法可以畫斜的四邊形。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM