本文轉(zhuǎn)載自:http://southpeak.github.io/2014/12/10/quartz2d-9/
透明層(TransparencyLayers)通過(guò)組合兩個(gè)或多個(gè)對(duì)象來(lái)生成一個(gè)組合圖形旱物。組合圖形被看成是單一對(duì)象遥缕。當(dāng)需要在一組對(duì)象上使用特效時(shí)单匣,透明層非常有用,如圖9-1所示的給三個(gè)圓使用陰影的效果逮矛。
Figure 9-1 Three circles as a composite in a transparency layer
如果沒有使用透明層來(lái)渲染圖9-1中的三個(gè)圓姓赤,對(duì)它們使用陰影的效果將是如圖9-2所示:
Figure 9-2 Three circles painted as separate entities
Quartz的透明層類似于許多流行的圖形應(yīng)用中的層。層是獨(dú)立的實(shí)體羡鸥。Quartz維護(hù)為每個(gè)上下文維護(hù)一個(gè)透明層棧,并且透明層是可以嵌套的纵朋。但由于層通常是棧的一部分柿顶,所以我們不能單獨(dú)操作它們。
我們通過(guò)調(diào)用函數(shù)CGContextBeginTransparencyLayer來(lái)開始一個(gè)透明層聂薪,該函數(shù)需要兩個(gè)參數(shù):圖形上下文與CFDictionary對(duì)象家乘。字典中包含我們所提供的指定層額外信息的選項(xiàng),但由于Quartz 2D API中沒有使用字典藏澳,所以我們傳遞一個(gè)NULL仁锯。在調(diào)用這個(gè)函數(shù)后,圖形狀態(tài)參數(shù)保持不變翔悠,除了alpha值[默認(rèn)設(shè)置為1]业崖、陰影[默認(rèn)關(guān)閉]野芒、混合模式[默認(rèn)設(shè)置為normal]、及其它影響最終組合的參數(shù)双炕。
在開始透明層操作后复罐,我們可以繪制任何想顯示在層上的對(duì)象。指定上下文中的繪制操作將被當(dāng)成一個(gè)組合對(duì)象繪制到一個(gè)透明背景上雄家。這個(gè)背景被當(dāng)作一個(gè)獨(dú)立于圖形上下文的目標(biāo)緩存效诅。
當(dāng)繪制完成后,我們調(diào)用函數(shù)CGContextEndTransparencyLayer趟济。Quartz將結(jié)合對(duì)象放入上下文乱投,并使用上下文的全局alpha值、陰影狀態(tài)及裁減區(qū)域作用于組合對(duì)象顷编。
在透明層中繪制需要三步:
調(diào)用函數(shù)CGContextBeginTransparencyLayer
在透明層中繪制需要組合的對(duì)象
調(diào)用函數(shù)CGContextEndTransparencyLayer
圖9-3顯示了在透明層中繪制三個(gè)矩形戚炫,其中將這三個(gè)矩形當(dāng)成一個(gè)整體來(lái)渲染陰影。
Figure 9-3 Three rectangles painted to a transparency layer
代碼清單9-1顯示了如何利用透明層生成圖9-3所示的矩形媳纬。
Listing 9-1 Painting to a transparency layer
void MyDrawTransparencyLayer(CGContext myContext,floatwd,floatht)
{
CGSize myShadowOffset = CGSizeMake (10,-20);
CGContextSetShadow (myContext, myShadowOffset,10);
CGContextBeginTransparencyLayer (myContext,NULL);
// Your drawing code here
CGContextSetRGBFillColor (myContext,0,1,0,1);
CGContextFillRect (myContext, CGRectMake (wd/3+50,ht/2,wd/4,ht/4));
CGContextSetRGBFillColor (myContext,0,0,1,1);
CGContextFillRect (myContext, CGRectMake (wd/3-50,ht/2-100,wd/4,ht/4));
CGContextSetRGBFillColor (myContext,1,0,0,1);
CGContextFillRect (myContext, CGRectMake (wd/3,ht/2-50,wd/4,ht/4));
CGContextEndTransparencyLayer (myContext);
}