IOS開發(fā)應(yīng)用之Quartz 2D學(xué)習(xí)指南
IOS開發(fā)應(yīng)用之Quartz 2D學(xué)習(xí)指南是本文要介紹的內(nèi)容,主要是來學(xué)習(xí)Quartz 2D的使用方法和操作。在IOS中,Quartz 2D像Core Animation,OpenGL ES和UIKit類一樣工作于可用的圖形和動(dòng)畫技術(shù)。
1.The Page
Quartz 2D使用painter model去imageing。在painter model中,每一個(gè)連續(xù)的繪制操作都是應(yīng)用一個(gè)paint layer到輸出畫布,通常稱為a page。page上面一個(gè)對(duì)象的繪制不能修改,除非通過添加更多的paint。就是通過添加一層一層的paint來構(gòu)建成的。此模型允許我們用一些簡(jiǎn)單的paint構(gòu)建復(fù)雜的images。
下面的圖展示了painter model 如何工作,順序影響***的效果。
2、繪制的地方--Graphics Context
a graphics context是一個(gè)不透明的CGContextRef數(shù)據(jù)類型,封裝了Quartz信息,用來在輸出設(shè)備(如PDF文件,bitmap,顯示窗口)上draw images。graphics context中的信息包括圖形繪制參數(shù)和一個(gè)page上和繪制設(shè)備相關(guān)的。Quartz的所有的類都被限制到在graphics context 上繪制。
我們可以把一個(gè)graphics context作為一個(gè)繪制的目標(biāo)。當(dāng)我們用Quartz繪制時(shí),所有和設(shè)備相關(guān)的特性都被限制到具體的graphics context中。換句話說,我們提供不同的graphic context可以繪制相同的image在不同的設(shè)備上,我們不需要去進(jìn)行其他任何的操作,Quartz已經(jīng)幫我們做了。
有一下幾種graphics context
(1)bitmap graphics context
其允許我們?cè)赽itmap上paint RGB顏色,CMYK顏色,或者灰度。bitmap是一個(gè)像素的矩形數(shù)組,每一個(gè)像素代表image上的一個(gè)點(diǎn)。
(2)PDF graphics context
(3)window graphics context
(4)layer context
3、Quartz 2D 不透明數(shù)據(jù)類型
Quartz 2D的API除了定義了graphics contexts之外,還定義了各種不透明的數(shù)據(jù)類型。因?yàn)榇薃PI是Core Graphics 框架的一部分,因此API中的數(shù)據(jù)類型和函數(shù)都使用了CG開頭作為前綴。
Quartz 2D從不透明數(shù)據(jù)類型創(chuàng)建對(duì)象,接著我們應(yīng)用程序用其完成特殊的繪制并輸出。下面講述三種對(duì)象我們可以用來進(jìn)行繪制操作。
我們可以創(chuàng)建一個(gè)PDF page對(duì)象旋轉(zhuǎn)和顯示此PDF page。在graphics context中應(yīng)用一個(gè)旋轉(zhuǎn)操作,然后要求Quartz 2D在graphics context中去繪制此page。
我們可以創(chuàng)建一個(gè)pattern 對(duì)象然后繪制一個(gè)pattern。構(gòu)成一個(gè)pattern去定義一個(gè)形狀。當(dāng)我們draw 一個(gè)graphics context時(shí)可以用pattern paint。
我們可以創(chuàng)建一個(gè)shading對(duì)象去在軸向或徑向填充一個(gè)區(qū)域的陰影。通過一個(gè)函數(shù)確定陰影中每一個(gè)點(diǎn)的顏色,然后用其去填充此陰影。
Quartz 2D中可以用的不透明的數(shù)據(jù)類型:
- CGPathRef,CGImageRef,CGLayerRef,CGPatternRef,CGShadingRef,CGGradientRef,
- CGFunctionRef,CGColorRef,CGColorSpaceRef,CGImageSourceRef, CGImageDestinationRef, CGFontRef,
關(guān)于PDF的就不在列出。
4、Graphics 狀態(tài)
Quartz通過修改current graphics state的參數(shù)可以改變繪制操作的結(jié)果。current graphics state決定了***繪制的結(jié)果。例如,當(dāng)我們調(diào)用函數(shù)去設(shè)置fill color,我們其實(shí)是修改了存儲(chǔ)在current graphics state中的值。還有其他的常用的狀態(tài)如line width, current position,text font size。
graphics context包括一個(gè)graphics states的堆棧。當(dāng)Quartz創(chuàng)建一個(gè)graphics context之后,堆棧是空的。當(dāng)保存一個(gè)graphics state,Quartz會(huì)push一個(gè)當(dāng)前graphics state 的拷貝到堆棧中。當(dāng)恢復(fù)一個(gè)graphics state時(shí),只用從堆棧中pop就行。CGContextSaveGState函數(shù)和CGContextRestoreGState函數(shù)是用來push和pop的。
并不是所有的當(dāng)前繪制環(huán)境的元素都是graphics state,例如,current path就不是graphics state。下面將列出一些graphics state 參數(shù):
Quratz 的坐標(biāo)系統(tǒng)如下:
Quratz 使用current transformation matrix(CTM)完成了具體的坐標(biāo)系統(tǒng)的無關(guān)性(完成了user space和device space的映射)。CTM是一個(gè)數(shù)學(xué)結(jié)構(gòu)的矩陣,能夠有效的描述一些相關(guān)的方程組。current transformation matrix是一個(gè)特殊的矩陣類型成為affine transform,其應(yīng)用translation,rotation,和scaling 操作(計(jì)算一個(gè)坐標(biāo)系統(tǒng)的move,rotate,resize)映射一個(gè)坐標(biāo)系統(tǒng)的點(diǎn)到另一個(gè)坐標(biāo)系統(tǒng)。
CTM有第二個(gè)目的。其允許我們transform繪制的對(duì)象。例如,我們想去繪制一個(gè)旋轉(zhuǎn)45度的box,可以先繪制一個(gè)box,然后旋轉(zhuǎn)坐標(biāo)系統(tǒng),Quratz用旋轉(zhuǎn)的坐標(biāo)系統(tǒng)去把其繪制在輸出設(shè)備上。
Quratz的缺省坐標(biāo)系統(tǒng)如上圖,原點(diǎn)在左下角。但是有些技術(shù)建立的graphics context和Quartz使用了不同的缺省坐標(biāo)系統(tǒng)。最常見的是坐標(biāo)系統(tǒng)是原點(diǎn)在左上角。在下面的情況下我們是在此坐標(biāo)系統(tǒng)下:
IOS中,UIView返回的drawing context。
IOS中,調(diào)用函數(shù)UIGraphicsBeginImageContextWithOptions創(chuàng)建的drawing context。
6、內(nèi)存管理:對(duì)象的所有權(quán)
Quratz 使用Core Foundation的內(nèi)存管理模型,引用計(jì)數(shù)。當(dāng)創(chuàng)建時(shí),Core Foundation對(duì)象的引用計(jì)數(shù)為1.我們可以通過調(diào)用retain函數(shù)去增加引用計(jì)數(shù),調(diào)用release函數(shù)去減少引用計(jì)數(shù)。
一下有幾點(diǎn)我們需要牢記:
(1)當(dāng)我們創(chuàng)建或者copy一個(gè)對(duì)象,則我們就擁有它,在用完之后我們一定要release它。
(2)如果我們不是從一個(gè)包含“create”和“copy”詞的函數(shù)得到的對(duì)象,則不能不要去release它。
(3)如果我們沒有對(duì)象的所有權(quán),但是我們想保存他,則應(yīng)該reatin它,并且記得release。例如,如果我們創(chuàng)建一個(gè)CGColorspace對(duì)象,則我們用函數(shù)CGColorSpaceRetain和CGColorSpaceRelease去retain和release。
小結(jié):IOS開發(fā)應(yīng)用之Quartz 2D學(xué)習(xí)指南的內(nèi)容介紹完了,希望通過本文的學(xué)習(xí)能對(duì)你有所幫助!