圖案是一個繪制操作的序列,繪制到圖形上下文中的一個序列。你可以使用模式就和你挑選你喜歡的顏色一樣。當(dāng)你使用一個模式時,Quartz將頁面分為一組模式單元,每個單元格都是模式圖像的大小,并使用你提供的回調(diào)函數(shù)繪制每一個單元格。圖6-1顯示的圖案繪制到窗口圖形上下文。
The Anatomy of a Pattern 圖案的解剖


?? 可以看到 圖案被解剖為一個個小的單元格。
?當(dāng)你不想使用Quartz 改變patterncell 時,你可以指定 特別的矩陣來達(dá)到這個效果。
Colored Patterns and Stencil (Uncolored) Patterns 彩色圖案與無色模式
彩色圖案具有與它們相關(guān)的固有顏色。改變用于創(chuàng)建模式單元的著色,而模式失去它的意義
您可以創(chuàng)建任何類型的圖案著色或模具。
Tiling 平鋪
平鋪是渲染pattern cell的一部分的過程。當(dāng)Quartz向一個設(shè)備呈現(xiàn)一個圖案時,Quartz可能需要調(diào)整圖案以適應(yīng)設(shè)備空間。也就是說,在用戶空間中定義的模式單元由于在用戶空間單元和設(shè)備像素之間的差異而被渲染到設(shè)備時可能無法完全匹配。
How Patterns Work?? 如何工作
圖案的操作和顏色差不多,填充顏色需要兩步:CGContextSetFillColor以及調(diào)用CGContextFillRect。 填充圖案也同樣:CGContextSetFillPattern以及CGContextFillRect、CGContextSetFillPattern。多了一步指定pattern。
舉個列子:當(dāng)你使用pattern 繪制時Quartz在幕后做了什么;在你填充或者描邊的時候,Quartz做了以下幾步針對每個pattern cell:
?? 1. 保存圖形狀態(tài);
?? 2. 將當(dāng)前轉(zhuǎn)換矩陣轉(zhuǎn)換為模式單元的原點(diǎn)。
?? 3.連接CTM 與圖案矩陣
?? 4.剪輯包圍pattern cell 的矩形框
?? 5.調(diào)用繪圖機(jī)制繪制模式單元格
?? 6.恢復(fù)圖形狀態(tài)。
?Painting Colored Patterns? 繪制彩色圖案
? 當(dāng)你 需要去繪制彩色圖案時,你需要執(zhí)行以下5步。
? 1.寫一個調(diào)用著色模式單元格的回調(diào)函數(shù)
? 2.設(shè)置彩色圖案顏色空間
? 3.解剖彩色圖案為單元格
? 4.指定彩色圖案作為填充或者描邊的圖案
? 5.開始繪制彩色圖案咯
這些步驟中有一些和繪制模板圖案(無色)是相同的,兩個的區(qū)別就在于著色。你可以看這些步驟是如何協(xié)同工作的:A Complete Colored Pattern Painting Function.
? ? ?? 第一步:寫一個調(diào)用著色模式單元格的回調(diào)函數(shù)
? 一個單元格的樣式完全取決于你,例如,列表6-1的繪制單元格的代碼 在圖6-2中得到了充分的展示,回想下單元格周圍的分割線,這些分割線并不是單元格的一部分,它繪制的邊界要大于代碼所繪制的矩形框。后面你需要制定圖案size。
? 繪制圖案調(diào)用單元格函數(shù):
typedef void (*CGPatternDrawPatternCallback) ( ? ?? //你可以自己命名函數(shù),下表6-1就命名的是MyDrawColoredPattern. 這個回調(diào)函數(shù)有兩個參數(shù)
void *info,? //info 參數(shù),是個指針指向與模式相關(guān)的私有數(shù)據(jù)。這個參數(shù)是可以選擇的,你也可以傳個空NULL,你傳遞給回調(diào)函數(shù)的數(shù)據(jù)和當(dāng)你后面創(chuàng)建模式提供的數(shù)據(jù)是一樣的,
CGContextRef context//繪制單元格的上下文
);
通過6-1列表中的代碼繪制的單元格是分割的,關(guān)于代碼的重要細(xì)節(jié):
圖案大小被聲明,你需要保存圖案大小在你寫代碼的時候,這里大小被聲明為一個全局的。繪圖功能之前,原型是由CGPatternDrawPatternCallback? 回調(diào)類型定義的。

? ? ? ? ? ?? 第二步:設(shè)置彩色圖案顏色空間

??? 1°:創(chuàng)建你需要的顏色空間,傳遞NULL可以清空顏色空間
? ? 2°:設(shè)置填充或者描邊
??? 3°:釋放顏色空間
? ? ? ? ?? 第三步:解剖為單元格
單元格是一個CGPattern對象, 通過調(diào)用方法CGPatternCreate;

拉伸的參數(shù)值: kCGPatternTilingNoDistortion?
????????????????????????? kCGPatternTilingConstantSpacingMinimalDistortion
????????????????????????? kCGPatternTilingConstantSpacing
isColored? 決定了是否給單元格上色,如果傳遞true,那就需要設(shè)定顏色空間了。
最后一個參數(shù)是指向CGPatternCallbacks數(shù)據(jù)結(jié)構(gòu)的指針。這個數(shù)據(jù)結(jié)構(gòu)有三個字段:
?

第一個字段 設(shè)置為0 ,第二個字段是個指向回調(diào)的指針,第三個釋放你傳遞給回到函數(shù)的iofo 參數(shù),也可傳遞NULL;
? ? ? ? ? ?? 第四步:指定圖案的描邊或者填充模式

需要傳遞的參數(shù)很明顯。
? ? ? ? ?? ?? 第五步:開始繪制單元格
完成以上幾步,就可以使用pattern 進(jìn)行繪制了,你可以調(diào)用CGContextStrokePath,CGContextFillPath,CGContextFillRect;
下面的代碼是完整的繪制彩色圖案的方法


?????????? //1? 聲明一個CGPattern 對象,用于后來創(chuàng)建
?????????? //2? 聲明一個顏色空間,用戶后來創(chuàng)建
????????? //3? 聲明透明度為1,指定為完全不透明
????????? //4 指定一個窗口的寬、高 。這個例子中,圖案被畫在一個窗口的區(qū)域上
????????? //5 聲明 并實現(xiàn)回調(diào)數(shù)據(jù)結(jié)構(gòu)
????????? //6 創(chuàng)建一個顏色空間對象,并且設(shè)置為空,當(dāng)你繪制彩色圖案時,圖案在繪圖回調(diào)中會使用它自己提供的顏色,這也就是牙呢空間置空的原因。
????????? //7 使用剛剛創(chuàng)建的顏色 為上下文 上色。
????????? //8 釋放顏色空間
????????? //9 傳遞空值,因為該圖案不需要額外信息傳遞給回調(diào)
????????? //10? 指定單元格的邊界 CGRect
????????? //11 傳入了一個CGAffintTransform 矩陣指定了如何從圖案空間像上下文的用戶空間的平移,這個例子中使用的是單位矩陣。
???????? //12 傳遞每個單元格的水平位置。 這個例子中 單元格是相鄰的。
???????? //13 傳遞每個單元格的垂直大小,作為每個單元格開始之間的垂直位置。
???????? //14.傳遞常量kCGPatternTilingConstantSpacing指定Quartz如何渲染圖案。
???????? //15 傳遞isColored 為True,指定圖案為彩色圖案
???????? //16 傳遞一個執(zhí)行回調(diào)結(jié)構(gòu)的指針。
???????? //17填充上下文 傳遞需要的參數(shù)
???????? //18 釋放CGPattern對象
???????? //19 填充矩形框使用剛剛創(chuàng)建的上下文
Painting Stencil Patterns?? 繪制無色 模板圖案
?步驟和 會繪制彩色圖案是一樣的。
一個完整的繪制模板圖案的方法

? 唯一不同的是 創(chuàng)建pattern的時候isColored 為false;
初學(xué)者,翻譯的不好,也可參考這個Quartz 2D 之模式?
?demo地址:Quartz 2D 模式之demo?