視覺效果 -- 陰影、蒙版

圓角

CALayer 有個叫 conrnerRadius 的屬性控制著圖層角的曲率,他是一個浮點(diǎn)數(shù),默認(rèn)為 0 (為0 的時候是直角)。默認(rèn)情況下,這個曲率值只影響背景顏色而不影響背景圖片或是子圖層。但將 masksToBounds 設(shè)置為 YES。圖層里面所有的東西都會被截取

self.layerView.layer.cornerRadius = 20.0f


圖層邊框

CALayer 另外兩個屬性 borderWidth 和 borderColor。二者共同定義了圖層邊的繪制樣式。這條線(也被稱為stroke)沿著圖層的bounds繪制。同時也包含圖層的角

borderColor 是以點(diǎn)為單位的定義邊框粗細(xì)的浮點(diǎn)數(shù),默認(rèn) 0

borderColor 定義了邊框顏色,默認(rèn)黑色。是CGColorRef 類型。

self.layerView.layer.borderWidth = 5.0f


陰影

shadowOpacity ? 給任意大于默認(rèn)值 0 的值,陰影就可以顯示在 任意圖層之下。值范圍 0.0( 不可見) 和 1.0 (完全不透明) 之間

如果想改動陰影,可以使用 shadowColor、shadowOffset、shadowRadius

shadowColor 控制著陰影顏色, CGColorRef 類型、默認(rèn)黑色

shadowOffset 控制著陰影的放心和距離。它是一個 CGSize 值,寬度控制著 陰影橫向的位移,高度控制著縱向的位移。 默認(rèn)和 ?{0, -3} ? 即陰影相當(dāng)于Y軸有3個點(diǎn)向上位移

shadowRadius 控制著陰影的模糊度。 為 0 ?時, 陰影和視圖一樣有個非常明確的邊界線。當(dāng)值越來越大時,邊界線就越來越模糊和自然。陰影越模糊,圖層的深度看上去就會更明顯

圖層的陰影繼承自內(nèi)容的外形,而不是根據(jù)邊界和角半徑來確定。為了計(jì)算陰影的形狀,Core Animation 會將寄宿圖(包括子視圖)考慮在內(nèi),然后通過這些來完美搭配圖層形狀從而創(chuàng)建一個陰影

shadowPath 屬性

計(jì)算陰影很消耗資源,尤其是有多個子視圖,每個圖層還有一個透明效果的寄宿圖的時候。如果事先知道陰影形狀,可以通過制定shadowPath 來提高性能。

shadowPath 是一個 CGPathRef 類型 (一個指向CGPath的指針)。CGPath 是一個 Core Graphics 對象,用來指定任意的一個矢量圖形。

CGMutablePathRef path = CGPathCreateMutable();

CGPathAddEllipseInRect(path, NULL, layerView.bounds);

layerView.layer.shadowPath = path;


圖層蒙版

CALayer 有個屬性 mask。 本身是個CALayer 類型,有和其他圖層一樣繪制和布局屬性。類似于一個子圖層,相對于父圖層布局。 mask 定義了父圖層的部分可見區(qū)域。

只有在mask圖層里的內(nèi)容才是他關(guān)心的內(nèi)容,其他一切都會被隱藏起來

CALayer *maskLayer = [CALayer layer];

maskLayer.frame = self.layerView.bounds;

UIImage *maskImage = [UIImage imageNamed:@"Cone.png"];

maskLayer.contents = (__bridge id)maskImage.CGImage;

self.imageView.layer.mask = maskLayer;


拉伸過濾

CALayer 提供了三種拉伸過濾方法:kCAFilterLinear、kCAFilterNearest、kCAFilterTrilinear

minification(縮小圖片)和magnification(放大圖片)默認(rèn)的過濾器都是 kCAFilterLinear

對于沒有斜線的小圖來說,最近過濾算法要好很多,對于大圖來說,雙線性濾波和三線性濾波表現(xiàn)的更出色。

線性濾波保留了形狀,最近過濾保留了像素的差異

view.layer.magnificationFilter = kCAFilterNearest;



組透明

UIView 有個alpha屬性來確定視圖的透明度。CALayer 有個等同的屬性叫 opacity,這兩個屬性都是影響子層級的。

如果希望設(shè)置一個圖層的透明度后,希望它包含的整個圖層樹像一個整體一樣的透明:

1.可以通過設(shè)置Info.plist 文件中的 UIViewGroupOpacity 為 yes。但是這個會影響整個app

2.設(shè)置CALayer的一個叫 shouldRasterize屬性來實(shí)現(xiàn)組透明效果。設(shè)置為yes,在應(yīng)用透明錢,圖層及其子圖層都會被整合成一個整體的圖片,這樣就么有透明度混合的問題了。

為了啟動 shouldRasterize屬性,我們設(shè)置了圖層的 rasterizationScale 屬性,默認(rèn)情況下,所有圖層的拉伸都是1.0,所以如果你使用了 shouldRasterize 屬性,你就要確保你設(shè)置了rasterizationScale屬性去匹配屏幕,以防止出險Retina屏幕像素化問題。

view.layer.shouldRasterize = YES;

view.layer.rasterizationScale = [UIScreen mainScreen].scale;

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容