Patterns

模式是重復(fù)繪制到圖形上下文的繪制操作序列比搭。 您可以使用與使用顏色相同的方式使用模式范舀。 當(dāng)使用模式繪制時(shí)仔拟,Quartz將頁(yè)面劃分為一組模式單元格衫樊,每個(gè)單元格都是模式圖像的大小,并使用您提供的回調(diào)繪制每個(gè)單元格利花。 圖6-1顯示了繪制到窗口圖形上下文的模式科侈。

6-1 模式樣式繪制到窗口

模式的解剖學(xué)

圖案單元是圖案的基本組成部分。 圖6-1所示模式的模式單元如圖6-2所示晋被。 黑色矩形不是圖案的一部分; 它被繪制以顯示模式單元格結(jié)束的位置兑徘。

6-2 模式單元格

該特定模式單元的大小包括四個(gè)彩色矩形的區(qū)域和矩形的上方和右側(cè)的空間,如圖6-3所示羡洛。 圖中圍繞每個(gè)圖案單元的黑色矩形不是單元的一部分; 它被繪制以指示單元的邊界挂脑。 當(dāng)創(chuàng)建模式單元格時(shí),您定義單元格的邊界并在邊界內(nèi)繪制欲侮。

6- 3 具有繪制以顯示每個(gè)單元格的邊界的黑色矩形的圖案單元格

您可以指定Quartz在水平和垂直方向上從下一個(gè)圖元單元開(kāi)始繪制每個(gè)圖案單元的開(kāi)始距離崭闲。 繪制圖6-3中的圖案單元,使得一個(gè)圖案單元的開(kāi)始恰好是遠(yuǎn)離下一圖案單元的圖案寬度威蕉,導(dǎo)致每個(gè)圖案單元鄰接下一圖案單元刁俭。 圖6-4中的模式單元具有在水平和垂直兩個(gè)方向上添加的空間。 您可以為每個(gè)方向指定不同的間距值韧涨。 如果使間距小于圖案單元格的寬度或高度牍戚,則圖案單元格重疊。

6-4 圖案單元格之間的間距

當(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中那樣靠在窗口上。

6-5 縮放的模式單元格
6-6 旋轉(zhuǎn)的模式單元格
6-7 平移的模式單元格

色的樣式和模板(未上色)

彩色圖案具有與其相關(guān)的固有顏色贩汉。 更改用于創(chuàng)建圖案單元的顏色驱富,并且該圖案失去其含義。 蘇格蘭格子(如圖6-8所示的樣品)是彩色圖案的一個(gè)例子匹舞。 彩色圖案中的顏色被指定為圖案單元格創(chuàng)建過(guò)程的一部分褐鸥,而不是圖案繪制過(guò)程的一部分。

6-8 彩色模板具有固有的顏色

其它圖案僅僅基于它們的形狀來(lái)定義赐稽,并且因此可以被認(rèn)為是模板圖案叫榕,未著色圖案或者甚至作為圖像掩模。 圖6-9中所示的紅色和黑色星形是同一圖案單元的每個(gè)再現(xiàn)姊舵。 單元格本身由一個(gè)形狀 - 填充的星晰绎。 當(dāng)定義圖案單元時(shí),沒(méi)有顏色與其相關(guān)聯(lián)蠢莺。 顏色被指定為圖案繪制過(guò)程的一部分寒匙,而不是模式單元格創(chuàng)建的一部分。

6-9 模板模式?jī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è)模式單元格:

  1. 保存圖形狀態(tài)翁脆。
  2. 將當(dāng)前轉(zhuǎn)換矩陣轉(zhuǎn)換為模式單元格的原點(diǎn)。
  3. 將CTM與模式矩陣連接鼻种。
  4. 剪切到模式單元格的邊界矩形反番。
  5. 調(diào)用繪圖回調(diào)來(lái)繪制模式單元格。
  6. 恢復(fù)圖形狀態(tài)叉钥。

Quartz照顧你的所有平鋪罢缸,重復(fù)渲染圖案單元格到繪圖空間,直到整個(gè)空間被繪投队。 您可以用圖案填充或描邊枫疆。 模式單元格可以是您指定的任何大小。 如果要查看模式蛾洛,應(yīng)確保模式單元格適合繪圖空間养铸。 例如雁芙,如果您的圖案單元格為8個(gè)單位轧膘,以10個(gè)單位為單位,并且您使用該圖案描畫寬度為2個(gè)單位的線兔甘,則由于圖案單元格的寬度為10個(gè)單位谎碍,因此會(huì)被裁切。 在這種情況下洞焙,您可能無(wú)法識(shí)別該模式蟆淀。

繪色模式

以下部分描述了繪制彩色圖案所需執(zhí)行的五個(gè)步驟:

  1. 編寫一個(gè)繪制彩色圖案單元的回調(diào)函數(shù)
  2. 設(shè)置彩色圖案顏色空間
  3. 設(shè)置彩色圖案的解剖
  4. 將彩色圖案指定為填充或描邊圖案
  5. 彩色的圖案繪制

這些是用于繪制模具模式的相同步驟。 兩者之間的區(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

這里是代碼做了什么:

  1. 通過(guò)調(diào)用函數(shù)CGColorSpaceCreatePattern,傳遞NULL作為基本顏色空間來(lái)創(chuàng)建適合于顏色模式的模式顏色空間翁授。
  2. 將填充顏色空間設(shè)置為圖案顏色空間拣播。 如果你正在描邊你的模式,調(diào)用CGContextSetStrokeColorSpace收擦。
  3. 釋放模式顏色空間贮配。
設(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);
}

這里是代碼做了什么:

  1. 聲明稍后創(chuàng)建的CGPattern對(duì)象的存儲(chǔ)阐肤。
  2. 聲明稍后創(chuàng)建的模式顏色空間的存儲(chǔ)。
  3. 聲明alpha變量讲坎,并將其設(shè)置為1孕惜,它指定模式的不透明度為完全不透明。
  4. 聲明變量以保存窗口的高度和寬度晨炕。在該示例中衫画,圖案被繪制在窗口的區(qū)域上。
  5. 聲明和填充回調(diào)結(jié)構(gòu)瓮栗,傳遞0作為版本和指向繪圖回調(diào)函數(shù)的指針削罩。此示例不提供發(fā)布信息回調(diào)瞄勾,因此該字段設(shè)置為NULL。
  6. 創(chuàng)建模式顏色空間對(duì)象弥激,將模式的基本顏色空間設(shè)置為NULL进陡。當(dāng)繪制彩色圖案時(shí),該圖案在圖形回調(diào)中提供自己的顏色微服,這就是為什么將顏色空間設(shè)置為NULL的原因趾疚。
  7. 將填充顏色空間設(shè)置為剛剛創(chuàng)建的圖案顏色空間對(duì)象。
  8. 釋放模式顏色空間對(duì)象以蕴。
  9. 傳遞NULL盗蟆,因?yàn)槟J讲恍枰獋鬟f給繪圖回調(diào)的任何附加信息。
  10. 傳遞指定模式單元格邊界的CGRect對(duì)象舒裤。
  11. 傳遞CGAffineTransform矩陣喳资,該矩陣指定如何將模式空間轉(zhuǎn)換為使用該模式的上下文的默認(rèn)用戶空間。這個(gè)例子傳遞單位矩陣腾供。
  12. 通過(guò)水平圖案大小作為每個(gè)單元格的開(kāi)始之間的水平位移仆邓。在這個(gè)例子中,一個(gè)單元格被涂在相鄰的單元格之下伴鳖。
  13. 將垂直圖案尺寸作為每個(gè)單元開(kāi)始之間的垂直位移节值。
  14. 通過(guò)常量kCGPatternTilingConstantSpacing來(lái)指定Quartz應(yīng)該如何渲染模式。有關(guān)詳細(xì)信息榜聂,請(qǐng)參閱平鋪搞疗。
  15. 對(duì)isColored參數(shù)傳遞true,以指定模式是彩色模式须肆。
  16. 傳遞指向包含版本信息的回調(diào)結(jié)構(gòu)的指針匿乃,以及指向繪制回調(diào)函數(shù)的指針。
  17. 設(shè)置填充模式豌汇,傳遞上下文幢炸,剛剛創(chuàng)建的CGPattern對(duì)象和指向一個(gè)alpha值的指針,該值指定Quartz應(yīng)用于模式的不透明度拒贱。
  18. 釋放CGPattern對(duì)象宛徊。
  19. 填充一個(gè)矩形,該矩形是傳遞到MyColoredPatternPainting例程的窗口大小逻澳。 Quartz使用剛剛設(shè)置的模式填充矩形闸天。

繪畫模具樣式

以下部分描述了繪制模板模式所需執(zhí)行的五個(gè)步驟:

  1. 編寫一個(gè)繪制模板模式的回調(diào)函數(shù)
  2. 設(shè)置模板圖案顏色空間
  3. 設(shè)置模板模式的解剖
  4. 將模板模式指定為填充或描邊模式
  5. 用鋼板蠟紙圖案繪圖

這些實(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-10 模板圖案單元格

看看清單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

這里是代碼做了什么:

  1. 此函數(shù)創(chuàng)建一個(gè)通用的RGB空間哈打。 通用顏色空間會(huì)使顏色與系統(tǒng)匹配斑粱。 有關(guān)詳細(xì)信息氧吐,請(qǐng)參閱創(chuàng)建常規(guī)顏色空間褪秀。
  2. 創(chuàng)建圖案顏色空間。 您提供的顏色空間指定顏色如何表示模式绽慈。 稍后恨旱,為模式設(shè)置顏色時(shí),必須使用模式顏色空間設(shè)置它們坝疼。 對(duì)于此示例搜贤,您將需要使用RGB值指定顏色。
  3. 設(shè)置填充圖案時(shí)要使用的顏色空間钝凶。 您可以通過(guò)調(diào)用函數(shù)CGContextSetStrokeColorSpace設(shè)置筆觸顏色空間仪芒。
  4. 釋放模式顏色空間對(duì)象。
  5. 釋放基本顏色空間對(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ù):

  1. 圖形上下文
  2. 您先前創(chuàng)建的CGPattern對(duì)象
  3. 顏色分量數(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
}

這里是代碼做了什么:

  1. 聲明一個(gè)數(shù)組來(lái)保存顏色值,并將該值(將在RGB顏色空間中)設(shè)置為不透明的綠色慢哈。
  2. 聲明和填充回調(diào)結(jié)構(gòu)蔓钟,傳遞0作為版本和指向繪圖回調(diào)函數(shù)的指針。此示例不提供發(fā)布信息回調(diào)卵贱,因此該字段設(shè)置為NULL滥沫。
  3. 創(chuàng)建RGB設(shè)備顏色空間。如果圖案繪制到顯示器艰赞,則需要提供此類型的顏色空間佣谐。
  4. 從RGB設(shè)備顏色空間創(chuàng)建模式顏色空間對(duì)象。
  5. 將填充顏色空間設(shè)置為剛剛創(chuàng)建的圖案顏色空間對(duì)象方妖。
  6. 創(chuàng)建模式對(duì)象狭魂。注意,第二個(gè)到最后一個(gè)參數(shù) - isColored參數(shù) - 是false党觅。模板模式不提供顏色雌澄,因此必須為此參數(shù)傳遞false。所有其他參數(shù)與為彩色圖案示例傳遞的參數(shù)類似杯瞻「湮看到一個(gè)完整的彩色圖案繪畫功能。
  7. 設(shè)置填充模式魁莉,傳遞先前聲明的顏色數(shù)組睬涧。
  8. 釋放CGPattern對(duì)象。
  9. 填充一個(gè)矩形旗唁。 Quartz使用剛剛設(shè)置的模式填充矩形畦浓。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市检疫,隨后出現(xiàn)的幾起案子讶请,更是在濱河造成了極大的恐慌,老刑警劉巖屎媳,帶你破解...
    沈念sama閱讀 218,451評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件夺溢,死亡現(xiàn)場(chǎng)離奇詭異论巍,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)风响,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,172評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門嘉汰,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人钞诡,你說(shuō)我怎么就攤上這事郑现。” “怎么了荧降?”我有些...
    開(kāi)封第一講書人閱讀 164,782評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵接箫,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我朵诫,道長(zhǎng)辛友,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書人閱讀 58,709評(píng)論 1 294
  • 正文 為了忘掉前任剪返,我火速辦了婚禮废累,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘脱盲。我一直安慰自己邑滨,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,733評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布钱反。 她就那樣靜靜地躺著掖看,像睡著了一般。 火紅的嫁衣襯著肌膚如雪面哥。 梳的紋絲不亂的頭發(fā)上哎壳,一...
    開(kāi)封第一講書人閱讀 51,578評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音尚卫,去河邊找鬼归榕。 笑死,一個(gè)胖子當(dāng)著我的面吹牛吱涉,可吹牛的內(nèi)容都是我干的刹泄。 我是一名探鬼主播,決...
    沈念sama閱讀 40,320評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼怎爵,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼循签!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起疙咸,我...
    開(kāi)封第一講書人閱讀 39,241評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎风科,沒(méi)想到半個(gè)月后撒轮,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體乞旦,經(jīng)...
    沈念sama閱讀 45,686評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,878評(píng)論 3 336
  • 正文 我和宋清朗相戀三年题山,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了兰粉。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,992評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡顶瞳,死狀恐怖玖姑,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情慨菱,我是刑警寧澤焰络,帶...
    沈念sama閱讀 35,715評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站符喝,受9級(jí)特大地震影響闪彼,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜协饲,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,336評(píng)論 3 330
  • 文/蒙蒙 一畏腕、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧茉稠,春花似錦描馅、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 31,912評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至吞获,卻和暖如春况凉,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背各拷。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 33,040評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工刁绒, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人烤黍。 一個(gè)月前我還...
    沈念sama閱讀 48,173評(píng)論 3 370
  • 正文 我出身青樓知市,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親速蕊。 傳聞我的和親對(duì)象是個(gè)殘疾皇子嫂丙,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,947評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • 圖案是一個(gè)繪制操作的序列,繪制到圖形上下文中的一個(gè)序列规哲。你可以使用模式就和你挑選你喜歡的顏色一樣跟啤。當(dāng)你使用一個(gè)模式...
    雪_晟閱讀 348評(píng)論 0 0
  • Quartz2D 編程指南(一)概覽、圖形上下文腥放、路徑泛啸、顏色與顏色空間 Quartz2D 編程指南(二)變換、圖案...
    xuyafei86閱讀 2,540評(píng)論 0 15
  • --繪圖與濾鏡全面解析 概述 在iOS中可以很容易的開(kāi)發(fā)出絢麗的界面效果秃症,一方面得益于成功系統(tǒng)的設(shè)計(jì)候址,另一方面得益...
    韓七夏閱讀 2,727評(píng)論 2 10
  • 在生活和工作中岗仑,每個(gè)人都會(huì)面臨非常多的選擇,有人說(shuō)人生就是一個(gè)選擇接著一個(gè)選擇莹规。在關(guān)鍵的時(shí)刻做出關(guān)鍵的選擇赔蒲,可能會(huì)...
    氪星人閱讀 1,190評(píng)論 0 1
  • 1.尖銳問(wèn)題怎么開(kāi)口 問(wèn)題很尖銳,可以把心里假設(shè)的事良漱,倒推回去兩三步來(lái)問(wèn)舞虱。 2.話題卡住怎么辦 談話卻卡住的話,其...
    丫頭emma閱讀 686評(píng)論 0 1