本文轉(zhuǎn)載自:http://southpeak.github.io/2014/12/05/quartz2d-7/
陰影是繪制在一個(gè)圖形對(duì)象下的且有一定偏移的圖片皆愉,它用于模擬光源照射到圖形對(duì)象上所形成的陰影效果嗜价,如果7-1所示。文本也可以有陰影幕庐。陰影可以讓一幅圖像看上去是立體的或者是浮動(dòng)的久锥。
Figure 7-1 A shadow
陰影有三個(gè)屬性:
x偏移值,用于指定陰影相對(duì)于圖片在水平方向上的偏移值异剥。
y偏移值瑟由,用于指定陰影相對(duì)于圖片在豎直方向上的偏移值。
模糊(blur)值冤寿,用于指定圖像是有一個(gè)硬邊(hard edge歹苦,如圖7-2左邊圖片所示),還是一個(gè)漫射邊(diffuse edge督怜,如圖7-1右邊圖片所示)
本章將描述陰影是如何工作的及如何用Quartz 2D API來(lái)創(chuàng)建陰影暂氯。
Figure 7-2 A shadow with no blur and another with a soft edge
Quartz中的陰影是圖形狀態(tài)的一部分。我們可以調(diào)用函數(shù)CGContextSetShadow來(lái)創(chuàng)建亮蛔,并傳入一個(gè)圖形上下文、偏移值及模糊值擎厢。陰影被設(shè)置后究流,任何繪制的對(duì)象都有一個(gè)陰影,且該陰影在設(shè)備RGB顏色空間中呈現(xiàn)出黑色的且alpha值為1/3动遭。換句話說(shuō)芬探,陰影是用RGBA值{0, 0, 0, 1.0/3.0}設(shè)置的。
我們可以調(diào)用函數(shù)CGContextSetShadowWithColor來(lái)設(shè)置彩色陰影厘惦,并傳遞一個(gè)圖形上下文偷仿、 偏移值哩簿、模糊值有CGColor顏色對(duì)象。顏色值依賴于顏色空間酝静。
如何在調(diào)用CGContextSetShadow或CGContextSetShadowWithColor之前保存了圖形狀態(tài)节榜,我們可以通過(guò)恢復(fù)圖形狀態(tài)來(lái)關(guān)閉陰影。我們也可以通過(guò)設(shè)置陰影顏色為NULL來(lái)關(guān)閉陰影别智。
偏移值指定了陰影相對(duì)于相關(guān)圖像的位置宗苍。這些偏移值由圖形上下文來(lái)描述,并用于計(jì)算陰影的位置:
一個(gè)正值的x偏移量指定陰影位于圖形對(duì)象的右側(cè)薄榛。
在Mac OS X中讳窟,正值的y指定陰影位于圖形對(duì)象的上邊,這與Quartz 2D默認(rèn)的坐標(biāo)值匹配敞恋。
在iOS中丽啡,如果我們用Quartz 2D API來(lái)創(chuàng)建PDF或者位圖圖形上下文,則正值的y指定陰影位于圖形對(duì)象的上邊硬猫。
在iOS中补箍,如果圖形上下文是由UIKit創(chuàng)建的,則正值的y指定陰影位于圖形對(duì)象的下邊浦徊。這與UIKit坐標(biāo)系統(tǒng)相匹配馏予。
陰影繪制慣例不受CTM影響
按照如下步驟來(lái)繪制陰影
保存圖形狀態(tài)
調(diào)用函數(shù)CGContextSetShadow,傳遞相應(yīng)的值
使用陰影繪制所有的對(duì)象
恢復(fù)圖形狀態(tài)
按照如下步驟來(lái)繪制彩色陰影
保存圖形狀態(tài)
創(chuàng)建一個(gè)CGColorSpace對(duì)象盔性,確保Quartz能正確地解析陰影顏色
創(chuàng)建一個(gè)CGColor對(duì)象來(lái)指定陰影的顏色
調(diào)用CGContextSetShadowWithColor霞丧,并傳遞相應(yīng)的值
使用陰影繪制所有的對(duì)象
恢復(fù)圖形狀態(tài)
圖7-3顯示了兩個(gè)帶有陰影的矩形,其中一個(gè)是彩色陰影冕香。
Figure 7-3 A colored shadow and a gray shadow
列表清單顯示了如何創(chuàng)建圖7-3中的圖像蛹尝。
Listing 7-1 A function that sets up shadows
void MyDrawWithShadows(CGContextRef myContext,floatwd,floatht);
{
CGSize? ? ? ? ? myShadowOffset = CGSizeMake (-15,20);
floatmyColorValues[] = {1,0,0,.6};
CGColorRef? ? ? myColor;
CGColorSpaceRef myColorSpace;
CGContextSaveGState(myContext);
CGContextSetShadow (myContext, myShadowOffset,5);
// Your drawing code here
CGContextSetRGBFillColor (myContext,0,1,0,1);
CGContextFillRect (myContext, CGRectMake (wd/3+75, ht/2, wd/4, ht/4));
myColorSpace = CGColorSpaceCreateDeviceRGB ();
myColor = CGColorCreate (myColorSpace, myColorValues);
CGContextSetShadowWithColor (myContext, myShadowOffset,5, myColor);
// Your drawing code here
CGContextSetRGBFillColor (myContext,0,0,1,1);
CGContextFillRect (myContext, CGRectMake (wd/3-75,ht/2-100,wd/4,ht/4));
CGColorRelease (myColor);
CGColorSpaceRelease (myColorSpace);
CGContextRestoreGState(myContext);
}