Quartz2D---蘋果官方的⼆維繪圖引擎(繪製基本圖形)

iOS開發UI篇—Quartz2D使用(繪製基本圖形)

一、簡單說明

Quartz 2D:是⼀個蘋果官方的⼆維繪圖引擎,同時支持iOS和Mac OS X系統(跨平臺,Quartz 2D的API純 C 語⾔的)。包含在 Core Graphics 框架中Cocos 2D :(Cocos2D-x、Cocos2D-iPhone、Cocos2D-HTML5等), Cocos2D 是一個 第三⽅開源的2D遊戲框架。做2D 遊戲的 還有 Sprite Kit。 一般3D 遊戲用 unity3D。


只有在當前view的drawRect才能獲取圖形上下文對象;手動無法保證有系統創建好的的圖形上下文對象,手動調用重繪
獲取圖形上下文是同一個方法,因此誰開的誰關閉

drawRect啥時候被調用?:1、當View第一次顯示到屏幕上時調用一次(加到UIWindow上顯示出來) 2、重繪的時候:調用View的setNeedsDisplay或setNeedsDisplayInRect時


   繪圖能用OC對象就不用C語言,繪製的東西其實是繪製到view的 。能用UIView就不要自己繪圖

1、C語言繪圖(直接調用Quartz 2D的API):1、獲取   圖形上下文(Graphics Context)對象CGContextRef:(參數rect是當前view的大小)  2、向對象中添加路徑  3、渲染CGCnoextStroke

2、OC對象繪圖(調用UIkit框架封裝好的API繪圖):UIBezierPath對象可以獨立使用(內部自動獲取),無需手動獲取圖形上下文對象
把路徑(UIBezierPath 創建)添加到  圖形上下文( CGContextRef ctx = UIGraphicsGetCurrentContext();可以不用獲取)對象中 ,,渲染(繪製路徑)Stroke/  創建路徑,渲染


1、繪製圓角矩形    圓角半徑超過邊長一半的2/3就是


兩種填充方式:非零繞數規則(方向有關(畫圓),次數無關),(奇偶填充規則),奇數次 填充

在UIView上繪圖:在drawRect:方法中取得上下⽂文後(它能保存繪圖信息,並且決定着繪製到什麼地⽅去),就可以繪製東西到view上
1、獲取與UIView相關的圖形上下文---View內部有個layer(圖層) 屬性,drawRect:⽅方法中取得的是⼀一 個Layer Graphics Context,因此, 繪製的東西其實是繪製到view的layer上 去了View能顯示東西,完全是因爲內部的layer

⾃定義view的步驟
➢ 新建⼀個類,繼承自UIView
➢ 實現- (void)drawRect:(CGRect)rect⽅法,然後在這個⽅法中 ● 取得跟當前view相關聯的圖形上下⽂
● 繪製相應的圖形內容
● 利用圖形上下⽂將繪製的所有內容渲染顯⽰示到view上⾯




圖形上下文(Graphics Context):是一個CGContextRef類型的數據

圖形上下文的作用:保存繪圖信息、繪圖狀態

決定繪製的輸出目標(繪製到什麼地方去?)(輸出目標可以是PDF文件、Bitmap或者顯示器的窗口上)

相同的一套繪圖序列,指定不同的Graphics Context,就可將相同的圖像繪製到不同的目標上。

Quartz2D提供了以下幾種類型的Graphics Context:

1、Bitmap Graphics Context

2、PDF Graphics Context

3、Window Graphics Context

4、Layer Graphics Context

5、Printer Graphics Context

只要上下文不同,繪製的地方就不同。

本文說明如何把圖片繪製到Bitmap上面去,即要求生成一張圖片,圖片上面保存了繪圖信息。

Bitmap就是圖片,相當於系統的UIimage。一個UIImage就是一個Bitmap

 

二、怎麼把圖片繪製到Bitmap上?

注意:不能在drawRect:方法中直接獲取Bitmap的上下文,需要我們自己進行創建。

代碼示例:

 1 //
 2 //  YYViewController.m
 3 //  06-繪製基本圖形
 4 //
 5 //  Created by apple on 14-6-22.
 6 //  Copyright (c) 2014年 itcase. All rights reserved.
 7 //
 8 
 9 #import "YYViewController.h"
10 
11 @interface YYViewController ()
12 @property (weak, nonatomic) IBOutlet UIImageView *iv;
13 @end
14 
15 @implementation YYViewController
16 
17 - (void)viewDidLoad
18 {
19     [super viewDidLoad];
20 
21     //加載圖片
22     //0.創建一個Bitmap上下文
23     //c語言的方法
24 //    CGBitmapContextCreate(<#void *data#>, <#size_t width#>, <#size_t height#>, <#size_t bitsPerComponent#>, <#size_t bytesPerRow#>, <#CGColorSpaceRef space#>, <#CGBitmapInfo bitmapInfo#>)
25     //oc中封裝的方法
26     //方法1
27 //    UIGraphicsBeginImageContext(<#CGSize size#>);
28     //方法2
29     UIGraphicsBeginImageContextWithOptions( CGSizeMake(200, 200), NO, 0);
30     //1.獲取bitmap上下文
31     CGContextRef ctx = UIGraphicsGetCurrentContext();
32     //2.繪圖(畫一個圓)
33     CGContextAddEllipseInRect(ctx, CGRectMake(0, 0, 100, 100));
34     //3.渲染
35     CGContextStrokePath(ctx);
36     //4.獲取生成的圖片
37     UIImage *image=UIGraphicsGetImageFromCurrentImageContext();
38     //5.顯示生成的圖片到imageview
39     self.iv.image=image;
40     //6.保存繪製好的圖片到文件中
41     //先將圖片轉換爲二進制數據,然後再將圖片寫到文件中
42 //    UIImageJPEGRepresentation(image, 1); //第二個參數爲保存的圖片的效果
43     NSData *data=UIImagePNGRepresentation(image);
44     [data writeToFile:@"/Users/apple/Desktop/abc.png" atomically:YES];
45 }
46 
47 - (void)didReceiveMemoryWarning
48 {
49     [super didReceiveMemoryWarning];
50     // Dispose of any resources that can be recreated.
51 }
52 
53 @end

程序執行效果:

程序執行完畢後,會在指定的位置創建一個abc.png的圖片

補充說明:

1.創建Bitmap圖形上下文的方法

  //方法1   UIGraphicsBeginImageContext(<#CGSize size#>);

  //方法2 UIGraphicsBeginImageContextWithOptions(CGSize size, BOOL opaque, CGFloat scale)

使用兩個方法同樣都可以創建,但是使用第一個方法將來創建的圖片清晰度和質量沒有第二種方法的好。
方法2接收三個參數:

CGSize size:指定將來創建出來的bitmap的大小

BOOL opaque:設置透明YES代表透明,NO代表不透明

CGFloat scale:代表縮放,0代表不縮放

創建出來的bitmap就對應一個UIImage對象

 

2.Quartz2D的內存管理

使用含有“Create”或“Copy”的函數創建的對象,使用完後必須釋放,否則將導致內存泄露

使用不含有“Create”或“Copy”的函數獲取的對象,則不需要釋放

如果retain了一個對象,不再使用時,需要將其release掉

可以使用Quartz 2D的函數來指定retain和release一個對象。例如,如果創建了一個CGColorSpace對象,則使用函數CGColorSpaceRetain和CGColorSpaceRelease來retain和release對象。

也可以使用Core Foundation的CFRetain和CFRelease。注意不能傳遞NULL值給這些函數 

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