模式是重復(fù)繪制到圖形上下文的繪制操作序列比搭。 您可以使用與使用顏色相同的方式使用模式范舀。 當(dāng)使用模式繪制時(shí)仔拟,Quartz將頁(yè)面劃分為一組模式單元格衫樊,每個(gè)單元格都是模式圖像的大小,并使用您提供的回調(diào)繪制每個(gè)單元格利花。 圖6-1顯示了繪制到窗口圖形上下文的模式科侈。
模式的解剖學(xué)
圖案單元是圖案的基本組成部分。 圖6-1所示模式的模式單元如圖6-2所示晋被。 黑色矩形不是圖案的一部分; 它被繪制以顯示模式單元格結(jié)束的位置兑徘。
該特定模式單元的大小包括四個(gè)彩色矩形的區(qū)域和矩形的上方和右側(cè)的空間,如圖6-3所示羡洛。 圖中圍繞每個(gè)圖案單元的黑色矩形不是單元的一部分; 它被繪制以指示單元的邊界挂脑。 當(dāng)創(chuàng)建模式單元格時(shí),您定義單元格的邊界并在邊界內(nèi)繪制欲侮。
您可以指定Quartz在水平和垂直方向上從下一個(gè)圖元單元開(kāi)始繪制每個(gè)圖案單元的開(kāi)始距離崭闲。 繪制圖6-3中的圖案單元,使得一個(gè)圖案單元的開(kāi)始恰好是遠(yuǎn)離下一圖案單元的圖案寬度威蕉,導(dǎo)致每個(gè)圖案單元鄰接下一圖案單元刁俭。 圖6-4中的模式單元具有在水平和垂直兩個(gè)方向上添加的空間。 您可以為每個(gè)方向指定不同的間距值韧涨。 如果使間距小于圖案單元格的寬度或高度牍戚,則圖案單元格重疊。
當(dāng)你繪制一個(gè)模式單元格虑粥,Quartz使用模式空間作為坐標(biāo)系如孝。 模式空間是一種抽象空間,它通過(guò)您創(chuàng)建模式(模式矩陣)時(shí)指定的變換矩陣映射到默認(rèn)用戶空間娩贷。
注:模式空間與用戶空間分離第晰。 未變換的模式空間映射到基本(未變換的)用戶空間,而不考慮當(dāng)前變換矩陣的狀態(tài)。 當(dāng)將變換應(yīng)用于模式空間時(shí)茁瘦,Quartz僅將變換應(yīng)用于模式空間品抽。
模式坐標(biāo)系的默認(rèn)約定是基礎(chǔ)圖形上下文的默認(rèn)約定。 默認(rèn)情況下甜熔,Quartz使用坐標(biāo)系統(tǒng)圆恤,其中正x值表示向右的位移,正y值表示向上位移纺非。 然而哑了,UIKit創(chuàng)建的圖形上下文使用不同的約定赘方,其中正y值表示向下位移烧颖。 雖然這個(gè)約定通常通過(guò)將變換連接到坐標(biāo)系統(tǒng)上來(lái)應(yīng)用于圖形上下文,但在這種情況下窄陡,Quartz也會(huì)修改模式空間的默認(rèn)約定以匹配炕淮。
如果你不想讓Quartz轉(zhuǎn)換模式單元格,你可以指定單位矩陣跳夭。 但是涂圆,您可以通過(guò)提供轉(zhuǎn)換矩陣來(lái)實(shí)現(xiàn)有趣的效果。 圖6-5顯示了縮放圖6-2所示模式單元的效果币叹。 圖6-6演示了旋轉(zhuǎn)模式單元润歉。 平移圖案單元有點(diǎn)更微妙。 圖6-7顯示了圖案的起源颈抚,圖案單元在水平和垂直兩個(gè)方向上平移踩衩,使得圖案不再像圖6-1中那樣靠在窗口上。
色的樣式和模板(未上色)
彩色圖案具有與其相關(guān)的固有顏色贩汉。 更改用于創(chuàng)建圖案單元的顏色驱富,并且該圖案失去其含義。 蘇格蘭格子(如圖6-8所示的樣品)是彩色圖案的一個(gè)例子匹舞。 彩色圖案中的顏色被指定為圖案單元格創(chuàng)建過(guò)程的一部分褐鸥,而不是圖案繪制過(guò)程的一部分。
其它圖案僅僅基于它們的形狀來(lái)定義赐稽,并且因此可以被認(rèn)為是模板圖案叫榕,未著色圖案或者甚至作為圖像掩模。 圖6-9中所示的紅色和黑色星形是同一圖案單元的每個(gè)再現(xiàn)姊舵。 單元格本身由一個(gè)形狀 - 填充的星晰绎。 當(dāng)定義圖案單元時(shí),沒(méi)有顏色與其相關(guān)聯(lián)蠢莺。 顏色被指定為圖案繪制過(guò)程的一部分寒匙,而不是模式單元格創(chuàng)建的一部分。
您可以在Quartz 2D中創(chuàng)建任何一種圖案顏色或模板。
平鋪
平鋪是將圖案單元呈現(xiàn)到頁(yè)面的一部分的過(guò)程锄弱。 當(dāng)Quartz向設(shè)備渲染模式時(shí)考蕾,Quartz可能需要調(diào)整模式以適應(yīng)設(shè)備空間。 也就是說(shuō)会宪,由于用戶空間單位和設(shè)備像素之間的差異肖卧,當(dāng)在用戶空間中定義的圖案單元在被呈現(xiàn)到設(shè)備時(shí)可能不完美地適合。
Quartz有三個(gè)平鋪選項(xiàng)掸鹅,可以在必要時(shí)調(diào)整模式塞帐。 Quartz可以保存:
- 該圖案,以調(diào)整圖案單元之間的間隔為代價(jià)巍沙,但是不超過(guò)一個(gè)器件像素葵姥。 這被稱為無(wú)失真。
- 單元之間的間隔句携,以犧牲圖案單元稍微變形為代價(jià)榔幸,但是不超過(guò)一個(gè)器件像素。 這被稱為具有最小失真的恒定間隔矮嫉。
- 在單元之間的間隔(對(duì)于最小失真選項(xiàng))削咆,以使得模式單元失真達(dá)到獲得快速平鋪所需的程度為代價(jià)。 這稱為恒定間距蠢笋。
模式如何工作
模式的操作類似于顏色拨齐,因?yàn)槟阍O(shè)置一個(gè)填充或筆觸模式,然后調(diào)用繪畫功能昨寞。 Quartz使用你設(shè)置為“paint”的模式瞻惋。例如,如果你想用一個(gè)純色繪制一個(gè)填充的矩形编矾,你首先調(diào)用一個(gè)函數(shù)熟史,如CGContextSetFillColor來(lái)設(shè)置填充顏色。然后調(diào)用函數(shù)CGContextFillRect窄俏,用指定的顏色繪制填充矩形蹂匹。要使用模式繪制,您首先調(diào)用函數(shù)CGContextSetFillPattern來(lái)設(shè)置模式凹蜈。然后你調(diào)用CGContextFillRect限寞,實(shí)際上用你指定的模式繪制填充矩形。用顏色和圖案繪畫之間的區(qū)別是仰坦,你必須定義模式履植。您向函數(shù)CGContextSetFillPattern提供模式和顏色信息。你將看到如何在繪畫色彩模式和繪畫模具模式中創(chuàng)建悄晃,設(shè)置和繪制模式玫霎。
這里有一個(gè)例子凿滤,說(shuō)明Quartz如何在幕后使用你提供的模式繪制。當(dāng)你用一個(gè)模式填充或描線時(shí)庶近,Quartz概念上執(zhí)行以下任務(wù)來(lái)繪制每個(gè)模式單元格:
- 保存圖形狀態(tài)翁脆。
- 將當(dāng)前轉(zhuǎn)換矩陣轉(zhuǎn)換為模式單元格的原點(diǎn)。
- 將CTM與模式矩陣連接鼻种。
- 剪切到模式單元格的邊界矩形反番。
- 調(diào)用繪圖回調(diào)來(lái)繪制模式單元格。
- 恢復(fù)圖形狀態(tài)叉钥。
Quartz照顧你的所有平鋪罢缸,重復(fù)渲染圖案單元格到繪圖空間,直到整個(gè)空間被繪投队。 您可以用圖案填充或描邊枫疆。 模式單元格可以是您指定的任何大小。 如果要查看模式蛾洛,應(yīng)確保模式單元格適合繪圖空間养铸。 例如雁芙,如果您的圖案單元格為8個(gè)單位轧膘,以10個(gè)單位為單位,并且您使用該圖案描畫寬度為2個(gè)單位的線兔甘,則由于圖案單元格的寬度為10個(gè)單位谎碍,因此會(huì)被裁切。 在這種情況下洞焙,您可能無(wú)法識(shí)別該模式蟆淀。
繪色模式
以下部分描述了繪制彩色圖案所需執(zhí)行的五個(gè)步驟:
- 編寫一個(gè)繪制彩色圖案單元的回調(diào)函數(shù)
- 設(shè)置彩色圖案顏色空間
- 設(shè)置彩色圖案的解剖
- 將彩色圖案指定為填充或描邊圖案
- 彩色的圖案繪制
這些是用于繪制模具模式的相同步驟。 兩者之間的區(qū)別是如何設(shè)置顏色信息澡匪。 你可以看到所有的步驟如何在一個(gè)完整的彩色圖案繪畫函數(shù)中熔任。
編寫一個(gè)繪制彩色圖案單元的回調(diào)函數(shù)
什么樣的模式單元格看起來(lái)完全取決于你。 對(duì)于這個(gè)例子唁情,清單6-1中的代碼繪制了如圖6-2所示的模式單元格疑苔。 回想一下,圖案單元周圍的黑線不是單元的一部分; 它被繪制以示出模式單元的邊界大于由代碼繪制的矩形甸鸟。 您稍后將模式大小指定為Quartz惦费。
您的模式單元格繪制函數(shù)是一個(gè)遵循此形式的回調(diào):
typedef void (*CGPatternDrawPatternCallback) (
void *info,
CGContextRef context
);
你可以命名你的回調(diào)名稱為任何你喜歡的。 清單6-1中的名稱為MyDrawColoredPattern抢韭。 回調(diào)有兩個(gè)參數(shù):
- info薪贫,一個(gè)指向與模式相關(guān)聯(lián)的私有數(shù)據(jù)的通用指針。 此參數(shù)是可選的; 你可以傳遞NULL刻恭。 傳遞到回調(diào)的數(shù)據(jù)是您稍后在創(chuàng)建模式時(shí)提供的相同數(shù)據(jù)瞧省。
- context,用于繪制圖案單元的圖形上下文。
清單6-1中的代碼繪制的模式單元是任意的鞍匾。 你的代碼繪制任何適合你創(chuàng)建的模式勉抓。 有關(guān)代碼的這些詳細(xì)信息很重要:
- 聲明模式大小。 在編寫繪圖代碼時(shí)候学,需要考慮模式大小藕筋。 這里,大小被聲明為全局梳码。 繪圖函數(shù)不特別指向大小隐圾,除非在注釋中。 稍后掰茶,您可以將模式大小指定為Quartz 2D暇藏。 請(qǐng)參閱設(shè)置彩色圖案的解剖。
- 繪制函數(shù)遵循由CGPatternDrawPatternCallback回調(diào)類型定義定義的原型濒蒋。
- 在代碼中執(zhí)行的繪圖設(shè)置顏色盐碱,這使得這是一個(gè)有色圖案。
// 繪制彩色圖案單元格的繪圖回調(diào)
#define H_PATTERN_SIZE 16
#define V_PATTERN_SIZE 18
void MyDrawColoredPattern (void *info, CGContextRef myContext)
{
CGFloat subunit = 5; // the pattern cell itself is 16 by 18
CGRect myRect1 = {{0,0}, {subunit, subunit}},
myRect2 = {{subunit, subunit}, {subunit, subunit}},
myRect3 = {{0,subunit}, {subunit, subunit}},
myRect4 = {{subunit,0}, {subunit, subunit}};
CGContextSetRGBFillColor (myContext, 0, 0, 1, 0.5);
CGContextFillRect (myContext, myRect1);
CGContextSetRGBFillColor (myContext, 1, 0, 0, 0.5);
CGContextFillRect (myContext, myRect2);
CGContextSetRGBFillColor (myContext, 0, 1, 0, 0.5);
CGContextFillRect (myContext, myRect3);
CGContextSetRGBFillColor (myContext, .5, 0, .5, 0.5);
CGContextFillRect (myContext, myRect4);
}
設(shè)置彩色圖案顏色空間
清單6-1中的代碼使用顏色來(lái)繪制模式單元格沪伙。 您必須通過(guò)將基本模式顏色空間設(shè)置為NULL瓮顽,確保Quartz使用您在繪制例程中使用的顏色繪制顏色,如清單6-2所示围橡。 每個(gè)編號(hào)的代碼行的詳細(xì)說(shuō)明在列表之后暖混。
// 創(chuàng)建基本圖案顏色空間
CGColorSpaceRef patternSpace;
patternSpace = CGColorSpaceCreatePattern (NULL);// 1
CGContextSetFillColorSpace (myContext, patternSpace);// 2
CGColorSpaceRelease (patternSpace);// 3
這里是代碼做了什么:
- 通過(guò)調(diào)用函數(shù)CGColorSpaceCreatePattern,傳遞NULL作為基本顏色空間來(lái)創(chuàng)建適合于顏色模式的模式顏色空間翁授。
- 將填充顏色空間設(shè)置為圖案顏色空間拣播。 如果你正在描邊你的模式,調(diào)用CGContextSetStrokeColorSpace收擦。
- 釋放模式顏色空間贮配。
設(shè)置彩色圖案的解剖
有關(guān)模式解剖的信息保存在CGPattern對(duì)象中。 您可以通過(guò)調(diào)用函數(shù)CGPatternCreate創(chuàng)建一個(gè)CGPattern對(duì)象塞赂,其原型如清單6-3所示泪勒。
// CGPatternCreate函數(shù)原型
CGPatternRef CGPatternCreate ( void *info,
CGRect bounds,
CGAffineTransform matrix,
CGFloat xStep,
CGFloat yStep,
CGPatternTiling tiling,
bool isColored,
const CGPatternCallbacks *callbacks );
info參數(shù)是指向想要傳遞給繪圖回調(diào)的數(shù)據(jù)的指針。 這是在編寫繪制彩色圖案單元的回調(diào)函數(shù)中討論的相同指針减途。
您可以在bounds參數(shù)中指定模式單元格的大小酣藻。 矩陣參數(shù)是指定模式矩陣的位置,它將模式坐標(biāo)系映射到圖形上下文的默認(rèn)坐標(biāo)系鳍置。 如果要使用與圖形上下文相同的坐標(biāo)系繪制圖案辽剧,請(qǐng)使用單位矩陣。 xStep和yStep參數(shù)指定模式坐標(biāo)系中單元格之間的水平和垂直間距税产。 請(qǐng)參閱模式解剖以查看有關(guān)邊界怕轿,模式矩陣和間距的信息偷崩。
平鋪參數(shù)可以是三個(gè)值之一:
- kCGPatternTilingNoDistortion
- kCGPatternTilingConstantSpacingMinimalDistortion
- kCGPatternTilingConstantSpacing
請(qǐng)參閱平鋪以查看關(guān)于平鋪的信息。
isColored參數(shù)指定模式單元格是彩色模式(true)還是模板模式(false)撞羽。 如果在此傳遞true阐斜,則繪制模式回調(diào)指定模式顏色,并且必須將模式顏色空間設(shè)置為彩色模式顏色空間(請(qǐng)參閱設(shè)置彩色模式顏色空間)诀紊。
傳遞給函數(shù)CGPatternCreate的最后一個(gè)參數(shù)是指向CGPatternCallbacks數(shù)據(jù)結(jié)構(gòu)的指針谒出。 此結(jié)構(gòu)有三個(gè)字段:
struct CGPatternCallbacks
{
unsigned int version;
CGPatternDrawPatternCallback drawPattern;
CGPatternReleaseInfoCallback releaseInfo;
};
將version字段設(shè)置為0. drawPattern字段是指向繪圖回調(diào)的指針。 releaseInfo字段是指向在釋放CGPattern對(duì)象時(shí)調(diào)用的回調(diào)的指針邻奠,以釋放傳遞給繪圖回調(diào)的info參數(shù)的存儲(chǔ)空間笤喳。 如果您未傳遞此參數(shù)中的任何數(shù)據(jù),則將此字段設(shè)置為NULL碌宴。
將彩色圖案指定為填充或描邊圖案
您可以通過(guò)調(diào)用相應(yīng)的函數(shù)CGContextSetFillPattern或CGContextSetStrokePattern使用您的模式來(lái)填充或描邊杀狡。 Quartz使用你的模式進(jìn)行任何后續(xù)的填充或描邊。
這些函數(shù)各有三個(gè)參數(shù):
- 圖形上下文
- 您先前創(chuàng)建的CGPattern對(duì)象
- 顏色分量數(shù)組
雖然彩色圖案提供了自己的顏色贰镣,但是你必須傳遞一個(gè)單一的alpha值呜象,以告知Quartz繪制時(shí)模式的整體不透明度。 α可以從1(完全不透明)到0(完全透明)碑隆。 這些代碼行顯示了如何為用于填充的彩色圖案設(shè)置不透明度的示例恭陡。
CGFloat alpha = 1;
CGContextSetFillPattern (myContext, myPattern, &alpha);
彩色的圖案繪制
完成上述步驟后,您可以調(diào)用任何繪制的Quartz 2D函數(shù)干跛。 您的模式用作“繪畫”子姜。例如,您可以調(diào)用CGContextStrokePath楼入,CGContextFillPath,CGContextFillRect或任何其他繪制的函數(shù)牧抽。
完整的彩色圖案繪畫函數(shù)
清單6-4中的代碼包含一個(gè)繪制彩色模式的函數(shù)嘉熊。 該功能包括前面討論的所有步驟。 每個(gè)編號(hào)的代碼行的詳細(xì)說(shuō)明在列表之后扬舒。
// 繪制彩色圖案的函數(shù)
void MyColoredPatternPainting (CGContextRef myContext,
CGRect rect)
{
CGPatternRef pattern;// 1
CGColorSpaceRef patternSpace;// 2
CGFloat alpha = 1,// 3
width, height;// 4
static const CGPatternCallbacks callbacks = {0, // 5
&MyDrawPattern,
NULL};
CGContextSaveGState (myContext);
patternSpace = CGColorSpaceCreatePattern (NULL);// 6
CGContextSetFillColorSpace (myContext, patternSpace);// 7
CGColorSpaceRelease (patternSpace);// 8
pattern = CGPatternCreate (NULL, // 9
CGRectMake (0, 0, H_PSIZE, V_PSIZE),// 10
CGAffineTransformMake (1, 0, 0, 1, 0, 0),// 11
H_PATTERN_SIZE, // 12
V_PATTERN_SIZE, // 13
kCGPatternTilingConstantSpacing,// 14
true, // 15
&callbacks);// 16
CGContextSetFillPattern (myContext, pattern, &alpha);// 17
CGPatternRelease (pattern);// 18
CGContextFillRect (myContext, rect);// 19
CGContextRestoreGState (myContext);
}
這里是代碼做了什么:
- 聲明稍后創(chuàng)建的CGPattern對(duì)象的存儲(chǔ)阐肤。
- 聲明稍后創(chuàng)建的模式顏色空間的存儲(chǔ)。
- 聲明alpha變量讲坎,并將其設(shè)置為1孕惜,它指定模式的不透明度為完全不透明。
- 聲明變量以保存窗口的高度和寬度晨炕。在該示例中衫画,圖案被繪制在窗口的區(qū)域上。
- 聲明和填充回調(diào)結(jié)構(gòu)瓮栗,傳遞0作為版本和指向繪圖回調(diào)函數(shù)的指針削罩。此示例不提供發(fā)布信息回調(diào)瞄勾,因此該字段設(shè)置為NULL。
- 創(chuàng)建模式顏色空間對(duì)象弥激,將模式的基本顏色空間設(shè)置為NULL进陡。當(dāng)繪制彩色圖案時(shí),該圖案在圖形回調(diào)中提供自己的顏色微服,這就是為什么將顏色空間設(shè)置為NULL的原因趾疚。
- 將填充顏色空間設(shè)置為剛剛創(chuàng)建的圖案顏色空間對(duì)象。
- 釋放模式顏色空間對(duì)象以蕴。
- 傳遞NULL盗蟆,因?yàn)槟J讲恍枰獋鬟f給繪圖回調(diào)的任何附加信息。
- 傳遞指定模式單元格邊界的CGRect對(duì)象舒裤。
- 傳遞CGAffineTransform矩陣喳资,該矩陣指定如何將模式空間轉(zhuǎn)換為使用該模式的上下文的默認(rèn)用戶空間。這個(gè)例子傳遞單位矩陣腾供。
- 通過(guò)水平圖案大小作為每個(gè)單元格的開(kāi)始之間的水平位移仆邓。在這個(gè)例子中,一個(gè)單元格被涂在相鄰的單元格之下伴鳖。
- 將垂直圖案尺寸作為每個(gè)單元開(kāi)始之間的垂直位移节值。
- 通過(guò)常量kCGPatternTilingConstantSpacing來(lái)指定Quartz應(yīng)該如何渲染模式。有關(guān)詳細(xì)信息榜聂,請(qǐng)參閱平鋪搞疗。
- 對(duì)isColored參數(shù)傳遞true,以指定模式是彩色模式须肆。
- 傳遞指向包含版本信息的回調(diào)結(jié)構(gòu)的指針匿乃,以及指向繪制回調(diào)函數(shù)的指針。
- 設(shè)置填充模式豌汇,傳遞上下文幢炸,剛剛創(chuàng)建的CGPattern對(duì)象和指向一個(gè)alpha值的指針,該值指定Quartz應(yīng)用于模式的不透明度拒贱。
- 釋放CGPattern對(duì)象宛徊。
- 填充一個(gè)矩形,該矩形是傳遞到MyColoredPatternPainting例程的窗口大小逻澳。 Quartz使用剛剛設(shè)置的模式填充矩形闸天。
繪畫模具樣式
以下部分描述了繪制模板模式所需執(zhí)行的五個(gè)步驟:
- 編寫一個(gè)繪制模板模式的回調(diào)函數(shù)
- 設(shè)置模板圖案顏色空間
- 設(shè)置模板模式的解剖
- 將模板模式指定為填充或描邊模式
- 用鋼板蠟紙圖案繪圖
這些實(shí)際上是用來(lái)繪制彩色圖案的步驟。 兩者之間的區(qū)別是如何設(shè)置顏色信息斜做。 你可以看到所有的步驟如何在一個(gè)完整的模板圖案繪制功能苞氮。
編寫一個(gè)繪制模板模式的回調(diào)函數(shù)
您為繪制模板模式而寫入的回調(diào)與針對(duì)彩色模式單元格描述的回調(diào)相同。 請(qǐng)參閱編寫繪制彩色圖案單元的回調(diào)函數(shù)陨享。 唯一的區(qū)別是你的繪制回調(diào)沒(méi)有指定任何顏色葱淳。 圖6-10所示的模式單元格不會(huì)從繪圖回調(diào)中獲得其顏色钝腺。 顏色設(shè)置在圖案顏色空間中繪圖顏色之外。
看看清單6-5中的代碼赞厕,繪制如圖6-10所示的模式單元格艳狐。 請(qǐng)注意,代碼只是創(chuàng)建一個(gè)路徑并填充路徑皿桑。 代碼不設(shè)置顏色挽绩。
// 繪制模板模式單元格的繪圖回調(diào)
#define PSIZE 16 // size of the pattern cell
static void MyDrawStencilStar (void *info, CGContextRef myContext)
{
int k;
double r, theta;
r = 0.8 * PSIZE / 2;
theta = 2 * M_PI * (2.0 / 5.0); // 144 degrees
CGContextTranslateCTM (myContext, PSIZE/2, PSIZE/2);
CGContextMoveToPoint(myContext, 0, r);
for (k = 1; k < 5; k++) {
CGContextAddLineToPoint (myContext,
r * sin(k * theta),
r * cos(k * theta));
}
CGContextClosePath(myContext);
CGContextFillPath(myContext);
}
設(shè)置模板圖案顏色空間
模板模式需要為Quartz繪制一個(gè)模式顏色空間同诫,如代碼清單6-6所示。 每個(gè)編號(hào)的代碼行的詳細(xì)說(shuō)明在列表之后。
// 為模板模式創(chuàng)建模式顏色空間的代碼
CGPatternRef pattern;
CGColorSpaceRef baseSpace;
CGColorSpaceRef patternSpace;
baseSpace = CGColorSpaceCreateWithName (kCGColorSpaceGenericRGB);// 1
patternSpace = CGColorSpaceCreatePattern (baseSpace);// 2
CGContextSetFillColorSpace (myContext, patternSpace);// 3
CGColorSpaceRelease(patternSpace);// 4
CGColorSpaceRelease(baseSpace);// 5
這里是代碼做了什么:
- 此函數(shù)創(chuàng)建一個(gè)通用的RGB空間哈打。 通用顏色空間會(huì)使顏色與系統(tǒng)匹配斑粱。 有關(guān)詳細(xì)信息氧吐,請(qǐng)參閱創(chuàng)建常規(guī)顏色空間褪秀。
- 創(chuàng)建圖案顏色空間。 您提供的顏色空間指定顏色如何表示模式绽慈。 稍后恨旱,為模式設(shè)置顏色時(shí),必須使用模式顏色空間設(shè)置它們坝疼。 對(duì)于此示例搜贤,您將需要使用RGB值指定顏色。
- 設(shè)置填充圖案時(shí)要使用的顏色空間钝凶。 您可以通過(guò)調(diào)用函數(shù)CGContextSetStrokeColorSpace設(shè)置筆觸顏色空間仪芒。
- 釋放模式顏色空間對(duì)象。
- 釋放基本顏色空間對(duì)象耕陷。
設(shè)置模板模式的解剖
您可以通過(guò)調(diào)用函數(shù)CGPatternCreate來(lái)指定有關(guān)模式的解剖結(jié)構(gòu)的信息掂名。 唯一的區(qū)別是你為isColored參數(shù)傳遞false。 有關(guān)您提供給CGPatternCreate函數(shù)的參數(shù)的更多信息啃炸,請(qǐng)參閱設(shè)置彩色模式的解剖铆隘。
將模板模式指定為填充或描邊模式
你可以通過(guò)調(diào)用相應(yīng)的函數(shù)CGContextSetFillPattern或CGContextSetStrokePattern來(lái)使用你的模式來(lái)填充或描邊。 Quartz使用你的模式進(jìn)行任何后續(xù)的填充或描邊南用。
這些函數(shù)各有三個(gè)參數(shù):
- 圖形上下文
- 您先前創(chuàng)建的CGPattern對(duì)象
- 顏色分量數(shù)組
模板模式在繪圖回調(diào)中不提供顏色,因此您必須向填充或描邊函數(shù)傳遞一個(gè)顏色掏湾,以告知Quartz要使用的顏色裹虫。 清單6-7顯示了如何為模板模式設(shè)置顏色的示例。 Quartz在您之前設(shè)置的顏色空間中解析顏色數(shù)組中的值融击。 因?yàn)榇耸纠褂迷O(shè)備RGB筑公,所以顏色數(shù)組包含紅色,綠色和藍(lán)色組件的值尊浪。 第四個(gè)值指定顏色的不透明度匣屡。
// 為彩色圖案設(shè)置不透明度的代碼
static const CGFloat color[4] = { 0, 1, 1, 0.5 }; //cyan, 50% transparent
CGContextSetFillPattern (myContext, myPattern, color);
用鋼板蠟紙圖案繪圖
完成上述步驟后封救,您可以調(diào)用任何繪制的Quartz 2D函數(shù)。 您的模式用作“繪畫”捣作。例如誉结,您可以調(diào)用CGContextStrokePath,CGContextFillPath券躁,CGContextFillRect或任何其他繪制的函數(shù)惩坑。
完整的模板圖案繪制功能
代碼清單6-8中的代碼包含一個(gè)繪制模板模式的函數(shù)。 該功能包括前面討論的所有步驟也拜。 每個(gè)編號(hào)的代碼行的詳細(xì)說(shuō)明在列表之后以舒。
// 繪制模具模式的函數(shù)
#define PSIZE 16
void MyStencilPatternPainting (CGContextRef myContext,
const Rect *windowRect)
{
CGPatternRef pattern;
CGColorSpaceRef baseSpace;
CGColorSpaceRef patternSpace;
static const CGFloat color[4] = { 0, 1, 0, 1 };// 1
static const CGPatternCallbacks callbacks = {0, &drawStar, NULL};// 2
baseSpace = CGColorSpaceCreateDeviceRGB ();// 3
patternSpace = CGColorSpaceCreatePattern (baseSpace);// 4
CGContextSetFillColorSpace (myContext, patternSpace);// 5
CGColorSpaceRelease (patternSpace);
CGColorSpaceRelease (baseSpace);
pattern = CGPatternCreate(NULL, CGRectMake(0, 0, PSIZE, PSIZE),// 6
CGAffineTransformIdentity, PSIZE, PSIZE,
kCGPatternTilingConstantSpacing,
false, &callbacks);
CGContextSetFillPattern (myContext, pattern, color);// 7
CGPatternRelease (pattern);// 8
CGContextFillRect (myContext,CGRectMake (0,0,PSIZE*20,PSIZE*20));// 9
}
這里是代碼做了什么:
- 聲明一個(gè)數(shù)組來(lái)保存顏色值,并將該值(將在RGB顏色空間中)設(shè)置為不透明的綠色慢哈。
- 聲明和填充回調(diào)結(jié)構(gòu)蔓钟,傳遞0作為版本和指向繪圖回調(diào)函數(shù)的指針。此示例不提供發(fā)布信息回調(diào)卵贱,因此該字段設(shè)置為NULL滥沫。
- 創(chuàng)建RGB設(shè)備顏色空間。如果圖案繪制到顯示器艰赞,則需要提供此類型的顏色空間佣谐。
- 從RGB設(shè)備顏色空間創(chuàng)建模式顏色空間對(duì)象。
- 將填充顏色空間設(shè)置為剛剛創(chuàng)建的圖案顏色空間對(duì)象方妖。
- 創(chuàng)建模式對(duì)象狭魂。注意,第二個(gè)到最后一個(gè)參數(shù) - isColored參數(shù) - 是false党觅。模板模式不提供顏色雌澄,因此必須為此參數(shù)傳遞false。所有其他參數(shù)與為彩色圖案示例傳遞的參數(shù)類似杯瞻「湮看到一個(gè)完整的彩色圖案繪畫功能。
- 設(shè)置填充模式魁莉,傳遞先前聲明的顏色數(shù)組睬涧。
- 釋放CGPattern對(duì)象。
- 填充一個(gè)矩形旗唁。 Quartz使用剛剛設(shè)置的模式填充矩形畦浓。