1.The Page
Quartz 2D使用painter model去imageing。在painter model中,每一個連續的繪制操作都是應用一個paint layer到輸出畫布,通常稱為a page。page上面一個對象的繪制不能修改,除非通過添加更多的paint。就是通過添加一層一層的paint來建構成的。此模型允許我們用一些簡單的paint建構複雜的images。
下面的圖展示了painter model 如何工作,順序影響最後的效果。

2、繪制的地方--Graphics Context
a graphics context是一個不透明的CGContextRef資料類型,封裝了Quartz資訊,用來在輸出裝置(如PDF檔案,bitmap,顯示視窗)上draw images。graphics context中的資訊包括圖形繪制參數和一個page上和繪制裝置相關的。Quartz的所有的類都被限制到在graphics context 上繪制。
我們可以把一個graphics context作為一個繪制的目标。當我們用Quartz繪制時,所有和裝置相關的特性都被限制到具體的graphics context中。換句話說,我們提供不同的graphic context可以繪制相同的image在不同的裝置上,我們不需要去進行其他任何的操作,Quartz已經幫我們做了。
有一下幾種graphics context
(1)bitmap graphics context
其允許我們在bitmap上paint RGB顔色,CMYK顔色,或者灰階。bitmap是一個像素的矩形數組,每一個像素代表image上的一個點。
(2)PDF graphics context
(3)window graphics context
(4)layer context
3、Quartz 2D 不透明資料類型
Quartz 2D的API除了定義了graphics contexts之外,還定義了各種不透明的資料類型。因為此API是Core Graphics 架構的一部分,是以API中的資料類型和函數都使用了CG開頭作為字首。
Quartz 2D從不透明資料類型建立對象,接着我們應用程式用其完成特殊的繪制并輸出。下面講述三種對象我們可以用來進行繪制操作。
我們可以建立一個PDF page對象旋轉和顯示此PDF page。在graphics context中應用一個旋轉操作,然後要求Quartz 2D在graphics context中去繪制此page。
我們可以建立一個pattern 對象然後繪制一個pattern。構成一個pattern去定義一個形狀。當我們draw 一個graphics context時可以用pattern paint。
我們可以建立一個shading對象去在軸向或徑向填充一個區域的陰影。通過一個函數确定陰影中每一個點的顔色,然後用其去填充此陰影。
Quartz 2D中可以用的不透明的資料類型:
CGPathRef,CGImageRef,CGLayerRef,CGPatternRef,CGShadingRef,CGGradientRef,
CGFunctionRef,CGColorRef,CGColorSpaceRef,CGImageSourceRef, CGImageDestinationRef, CGFontRef,
關于PDF的就不在列出。
4、Graphics 狀态
Quartz通過修改current graphics state的參數可以改變繪制操作的結果。current graphics state決定了最後繪制的結果。例如,當我們調用函數去設定fill color,我們其實是修改了存儲在current graphics state中的值。還有其他的常用的狀态如line width, current position,text font size。
graphics context包括一個graphics states的堆棧。當Quartz建立一個graphics context之後,堆棧是空的。當儲存一個graphics state,Quartz會push一個目前graphics state 的拷貝到堆棧中。當恢複一個graphics state時,隻用從堆棧中pop就行。CGContextSaveGState函數和CGContextRestoreGState函數是用來push和pop的。
并不是所有的目前繪制環境的元素都是graphics state,例如,current path就不是graphics state。下面将列出一些graphics state 參數:
5、Quartz 2D坐标系統
Quratz 的坐标系統如下:
Quratz 使用current transformation matrix(CTM)完成了具體的坐标系統的無關性(完成了user space和device space的映射)。CTM是一個數學結構的矩陣,能夠有效的描述一些相關的方程組。current transformation matrix是一個特殊的矩陣類型成為affine transform,其應用translation,rotation,和scaling 操作(計算一個坐标系統的move,rotate,resize)映射一個坐标系統的點到另一個坐标系統。
CTM有第二個目的。其允許我們transform繪制的對象。例如,我們想去繪制一個旋轉45度的box,可以先繪制一個box,然後旋轉坐标系統,Quratz用旋轉的坐标系統去把其繪制在輸出裝置上。
Quratz的預設坐标系統如上圖,原點在左下角。但是有些技術建立的graphics context和Quartz使用了不同的預設坐标系統。最常見的是坐标系統是原點在左上角。在下面的情況下我們是在此坐标系統下:
IOS中,UIView傳回的drawing context。
IOS中,調用函數UIGraphicsBeginImageContextWithOptions建立的drawing context。
6、記憶體管理:對象的所有權
Quratz 使用Core Foundation的記憶體管理模型,引用計數。當建立時,Core Foundation對象的引用計數為1.我們可以通過調用retain函數去增加引用計數,調用release函數去減少引用計數。
一下有幾點我們需要牢記:
(1)當我們建立或者copy一個對象,則我們就擁有它,在用完之後我們一定要release它。
(2)如果我們不是從一個包含“create”和“copy”詞的函數得到的對象,則不能不要去release它。
(3)如果我們沒有對象的所有權,但是我們想儲存他,則應該reatin它,并且記得release。例如,如果我們建立一個CGColorspace對象,則我們用函數CGColorSpaceRetain和CGColorSpaceRelease去retain和release。
小結:IOS開發應用之Quartz 2D學習指南的内容介紹完了,希望通過本文的學習能對你有所幫助!