圓角 cornerRadius
注意的是, 在設(shè)置 masksToBounds 屬性后,layer內(nèi)部的也都會(huì)被這個(gè)圓角給剪切。
邊框 borderWidth 和 borderColor
邊框是繪制在 layer 的 bounds 內(nèi)部的,即內(nèi)邊框。并且邊框會(huì)顯示在內(nèi)部所有子layer的上方。
陰影
shadowOpacity (0~1.0f) 控制layer的透明度。 shadowColor 控制陰影顏色,默認(rèn)是黑色。
shadowOffset (CGSize) 控制陰影的方向和距離。默認(rèn)是 {0,-3}, 即iOS上陰影是默認(rèn)向上的。
shadowRadius 是陰影的擴(kuò)散半徑。當(dāng)是0的時(shí)候,就是硬陰影,值越大越是自然的軟陰影。蘋果app傾向于軟陰影。
圖層的陰影處理得更智能一些,會(huì)檢查圖層的圖像,進(jìn)而根據(jù)其形狀繪制陰影。陰影是在 layer 的 bounds 之外的,所以在指定 masksToBounds 后,這些陰影由于不在 bounds 內(nèi),都被裁切掉了。解決方法有二,一個(gè)是在這個(gè)layer 添加一個(gè)父 layer, 父layer 指定陰影屬性,而不指定 masksToBounds。 另一種方法就是使用 shadowPath 來自己繪制好陰影的形狀。前一種方法,計(jì)算量大,可能會(huì)影響效率。對(duì)于 shadowPath, 是一個(gè) CGPathRef 類型的值,簡單的使用 CoreGraphics 創(chuàng)建,復(fù)雜的使用 UIBezierPath 更方便。
遮罩
mask 屬性是一個(gè) CALayer 類型。意思和2D游戲的掩碼位圖差不多,將不透明的部分取出來,透明的部分過濾掉, 生成一個(gè)新的形狀。
縮放濾鏡
minificationFileter (縮小器) 和 magnificationFilter (放大器) 兩個(gè)屬性是用來指定顯示圖像的時(shí)候,當(dāng)顯示的尺寸和實(shí)際圖片尺寸不一樣的時(shí)候,幾種圖片的像素處理算法。算法主要有三種:
- kCAFilterLinear (默認(rèn))
- kCAFilterNearest
- kCAFilterTrilinear
kCAFilterLInear 對(duì)許多像素進(jìn)行采樣計(jì)算出最終的一個(gè)像素值,其結(jié)果是非常順滑的,但是在放大的時(shí)候,會(huì)有些模糊。
kCAFilterTrilinear 于 kCAFilterLinear 類似, 但是他會(huì)存儲(chǔ)許多尺寸的圖像,在計(jì)算某個(gè)最終圖像時(shí)候,會(huì)使用相鄰的兩個(gè)尺寸的圖像進(jìn)行計(jì)算。比之,計(jì)算時(shí)效率好一些。
kCAFilterNearest 有點(diǎn)粗魯。當(dāng)圖像中沒有斜線的時(shí)候,這個(gè)非常有優(yōu)勢,放大后的圖像沒有一點(diǎn)模糊。
組透明
UIView 的 alpha, CALayer 的 opacity 都是控制透明度的。它們會(huì)影響孩子們。比如當(dāng)設(shè)置 50% 的時(shí)候,layer 的每個(gè)像素點(diǎn),一半顯示自己的顏色,一半顯示孩子的layer;而孩子也會(huì)一半顯示自己的顏色, 這樣一半的一半就是 25%。所以孩子的顏色會(huì)顯示 75% ,這樣最終看起來孩子的alpha會(huì)是0.75, 看起來極不協(xié)調(diào)。
一個(gè)方法是在 info.plist 中設(shè)置 UIViewGroupOpacity 屬性,它會(huì)全局設(shè)置,也會(huì)影響全局。
另一個(gè)方法是設(shè)置 layer 的 shouldRasterise 屬性。它會(huì)將圖層和子圖層合成一個(gè)圖片。另外注意連帶設(shè)置好 rasterizationiScale 屬性和屏幕的內(nèi)容比例一樣。