圆角
CALayer 有个叫 conrnerRadius 的属性控制着图层角的曲率,他是一个浮点数,默认为 0 (为0 的时候是直角)。默认情况下,这个曲率值只影响背景颜色而不影响背景图片或是子图层。但将 masksToBounds 设置为 YES。图层里面所有的东西都会被截取
self.layerView.layer.cornerRadius = 20.0f
图层边框
CALayer 另外两个属性 borderWidth 和 borderColor。二者共同定义了图层边的绘制样式。这条线(也被称为stroke)沿着图层的bounds绘制。同时也包含图层的角
borderColor 是以点为单位的定义边框粗细的浮点数,默认 0
borderColor 定义了边框颜色,默认黑色。是CGColorRef 类型。
self.layerView.layer.borderWidth = 5.0f
阴影
shadowOpacity 给任意大于默认值 0 的值,阴影就可以显示在 任意图层之下。值范围 0.0( 不可见) 和 1.0 (完全不透明) 之间
如果想改动阴影,可以使用 shadowColor、shadowOffset、shadowRadius
shadowColor 控制着阴影颜色, CGColorRef 类型、默认黑色
shadowOffset 控制着阴影的放心和距离。它是一个 CGSize 值,宽度控制着 阴影横向的位移,高度控制着纵向的位移。 默认和 {0, -3} 即阴影相当于Y轴有3个点向上位移
shadowRadius 控制着阴影的模糊度。 为 0 时, 阴影和视图一样有个非常明确的边界线。当值越来越大时,边界线就越来越模糊和自然。阴影越模糊,图层的深度看上去就会更明显
图层的阴影继承自内容的外形,而不是根据边界和角半径来确定。为了计算阴影的形状,Core Animation 会将寄宿图(包括子视图)考虑在内,然后通过这些来完美搭配图层形状从而创建一个阴影
shadowPath 属性
计算阴影很消耗资源,尤其是有多个子视图,每个图层还有一个透明效果的寄宿图的时候。如果事先知道阴影形状,可以通过制定shadowPath 来提高性能。
shadowPath 是一个 CGPathRef 类型 (一个指向CGPath的指针)。CGPath 是一个 Core Graphics 对象,用来指定任意的一个矢量图形。
CGMutablePathRef path = CGPathCreateMutable();
CGPathAddEllipseInRect(path, NULL, layerView.bounds);
layerView.layer.shadowPath = path;
图层蒙版
CALayer 有个属性 mask。 本身是个CALayer 类型,有和其他图层一样绘制和布局属性。类似于一个子图层,相对于父图层布局。 mask 定义了父图层的部分可见区域。
只有在mask图层里的内容才是他关心的内容,其他一切都会被隐藏起来
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(放大图片)默认的过滤器都是 kCAFilterLinear
对于没有斜线的小图来说,最近过滤算法要好很多,对于大图来说,双线性滤波和三线性滤波表现的更出色。
线性滤波保留了形状,最近过滤保留了像素的差异
view.layer.magnificationFilter = kCAFilterNearest;
组透明
UIView 有个alpha属性来确定视图的透明度。CALayer 有个等同的属性叫 opacity,这两个属性都是影响子层级的。
如果希望设置一个图层的透明度后,希望它包含的整个图层树像一个整体一样的透明:
1.可以通过设置Info.plist 文件中的 UIViewGroupOpacity 为 yes。但是这个会影响整个app
2.设置CALayer的一个叫 shouldRasterize属性来实现组透明效果。设置为yes,在应用透明钱,图层及其子图层都会被整合成一个整体的图片,这样就么有透明度混合的问题了。
为了启动 shouldRasterize属性,我们设置了图层的 rasterizationScale 属性,默认情况下,所有图层的拉伸都是1.0,所以如果你使用了 shouldRasterize 属性,你就要确保你设置了rasterizationScale属性去匹配屏幕,以防止出险Retina屏幕像素化问题。
view.layer.shouldRasterize = YES;
view.layer.rasterizationScale = [UIScreen mainScreen].scale;