圓角
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;