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

一、繪圖路徑

A.簡單說明
在畫線的時候,方法的內部默認創建一個path。它把路徑都放到了path裏面去。
1.創建路徑  cgmutablepathref 調用該方法相當於創建了一個路徑,這個路徑用來保存繪圖信息。
2.把繪圖信息添加到路徑裏邊。
以前的方法是點的位置添加到ctx(圖形上下文信息)中,ctx 默認會在內部創建一個path用來保存繪圖信息。
在圖形上下文中有一塊存儲空間專門用來存儲繪圖信息,其實這塊空間就是CGMutablePathRef。
3.把路徑添加到上下文中。
代碼示例:
繪製一條直線的代碼:
[objc] view plaincopy
  1. //1.獲取圖形上下文  
  2. CGContextRef ctx=UIGraphicsGetCurrentContext();  
  3. //2.繪圖(畫線)  
  4. //設置起點  
  5. CGContextMoveToPoint(ctx, 2020);  
  6. //設置終點  
  7. CGContextAddLineToPoint(ctx, 200300);  
  8. //渲染  
  9. CGContextStrokePath(ctx);  


上面的代碼和下面的代碼是等價的。  

[objc] view plaincopy
  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, NULL2020);  
  10. CGPathAddLineToPoint(path, NULL200300);  
  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);  


B.直接使用path的好處:
第一種代碼的閱讀性不好,不便於區分。使用path,則一個path就代表一條路徑。
比如:如果要在上下文中繪製多個圖形,這種情況下建議使用path。
代碼示例:
[objc] view plaincopy
  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, NULL2020);  
  14.     CGPathAddLineToPoint(path, NULL200300);  
  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(path1NULL, CGRectMake(5050100100));  
  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的方法):繪製實心的四邊形,注意沒有空心的方法
第五種:畫根線,設置線條的寬度(通過這種方式可以畫斜的四邊形)
代碼示例:
[objc] view plaincopy
  1. #import "YYview.h"  
  2.   
  3. @implementation YYview  
  4.   
  5.   
  6. - (void)drawRect:(CGRect)rect  
  7. {  
  8.     //獲取圖形上下文  
  9.     CGContextRef ctx=UIGraphicsGetCurrentContext();  
  10.     //第一種畫法,通過連接固定的點繪製四邊形  
  11. //    CGContextMoveToPoint(ctx, 0, 20);  
  12. //    CGContextAddLineToPoint(<#CGContextRef c#>, <#CGFloat x#>, <#CGFloat y#>);  
  13. //    CGContextAddLineToPoint(<#CGContextRef c#>, <#CGFloat x#>, <#CGFloat y#>);  
  14. //    CGContextAddLineToPoint(<#CGContextRef c#>, <#CGFloat x#>, <#CGFloat y#>);  
  15.      
  16.     //第二種方式:指定起點和寬高繪製四邊形  
  17. //    CGContextAddRect(ctx, CGRectMake(20, 20, 200, 100));  
  18. //    //渲染  
  19. //    CGContextStrokePath(ctx);  
  20.       
  21.     //第三種方式:二種的兩步合併成一步。  
  22.     //畫空心的四邊形  
  23. //    CGContextStrokeRect(ctx, CGRectMake(20, 20, 200, 100));  
  24. //    //畫實心的四邊形  
  25. //    CGContextFillRect(ctx, CGRectMake(20, 20, 200, 100));  
  26.       
  27.     //第四種方式(oc的方法):繪製實心的四邊形,注意沒有空心的方法  
  28.     UIRectFill(CGRectMake(2020200100));  
  29.       
  30.     //第五種方式:畫根線,設置線條的寬度(通過這種方式可以畫斜的四邊形)  
  31. //    CGContextMoveToPoint(ctx, 20, 20);  
  32. //    CGContextAddLineToPoint(ctx, 100, 200);  
  33. //    CGContextSetLineWidth(ctx, 50);  
  34. //    //注意,線條只能畫成是空心的  
  35. //    CGContextStrokePath(ctx);  
  36.       
  37. }  
  38. @end  


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


關於drawRect以及- (void)setNeedsDisplay 。這裏貼出另一片文章《傳送門

使用Quartz繪製小黃人的一篇教程《傳送門

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章