Quartz 2D 之Patterns

圖案是一個繪制操作的序列,繪制到圖形上下文中的一個序列。你可以使用模式就和你挑選你喜歡的顏色一樣。當(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?


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容