iOS 动画 Animation-0-1:CALayer十则示例-CALayer
CALayer
前面我们看过使用CALayer的示例,也就是设置各种属性。
关于CALayer还有几点没提:
- 图层可以包含子图层。就像视图可以包含子视图,图层也可以有子图层,稍加利用就能打造漂亮的效果!
- 图层属性自带动画效果。修改图层属性时,存在默认的动画效果,你也可以自定义动画行为。
- 图层是轻量概念。相对视图而言,图层更加轻量,因此图层可以帮助提升性能。
- 图层有大量实用属性。前面你已经看过几条了,我们继续探索!
刚刚说CALayer图层有很多属性,我们来看一批实用属性:有些属性你可能第一次见,但真的很方便!
// 1
let layer = CALayer()
layer.frame = someView.bounds
// 2
layer.contents = UIImage(named: "star")?.CGImage
layer.contentsGravity = kCAGravityCenter
// 3
layer.magnificationFilter = kCAFilterLinear
layer.geometryFlipped = false
// 4
layer.backgroundColor = UIColor(red: 11/255.0, green: 86/255.0, blue: 14/255.0, alpha: 1.0).CGColor
layer.opacity = 1.0
layer.hidden = false
layer.masksToBounds = false
// 5
layer.cornerRadius = 100.0
layer.borderWidth = 12.0
layer.borderColor = UIColor.whiteColor().CGColor
// 6
layer.shadowOpacity = 0.75
layer.shadowOffset = CGSize(width: 0, height: 3)
layer.shadowRadius = 3.0
someView.layer.addSublayer(layer)
在以上代码中:
- 创建一个CALayer实例,并把框架设为someView边框。
- 将图层内容设为一张图片,并使其在图层内居中,注意赋值的类型是底层的Quartz图像数据(CGImage)。
- 使用过滤器,过滤器在图像利用contentsGravity放大时发挥作用,可用于改变大小(缩放、比例缩放、填充比例缩放)和位置(中心、上、右上、右等等)。以上属性的改变没有动画效果,另外如果geometryFlipped未设为true,几何位置和阴影会上下颠倒。继续:
- 把背景色设为Ray最爱的深绿色。:] 然后让图层透明、可见。同时令图层不要遮罩内容,意思是如果图层尺寸小于内容(星星图片),图像不会被裁减。
- 图层边角半径设为图层宽度的一半,使边缘变为圆形,注意图层颜色赋值类型为Quartz颜色引用(CGColor)。
- 创建阴影,设shouldRasterize为true(后文还会提到),然后将图层加入视图结构树。
结果如下:
CALayer还有两个附加属性有助于改善性能:shouldRasterize和drawsAsynchronously。
shouldRasterize默认为false,设为true可以改善性能,因为图层内容只需要一次渲染。相对画面中移动但自身外观不变的对象效果拔群。
drawsAsynchronously默认值也是false。与shouldRasterize相对,该属性适用于图层内容需要反复重绘的情况,此时设成true可能会改善性能,比如需要反复绘制大量粒子的粒子发射器图层(可以参考后面的CAEmitterLayer示例)。
谨记:如果想将已有图层的shouldRasterize或drawsAsynchronously属性设为true,一定要三思而后行,考虑可能造成的影响,对比true与false的性能差异,辨明属性设置是否有积极效果。设置不当甚至会导致性能大幅下降。
无论如何还是先回到图层演示应用,其中有些控件可以用来调整CALayer的属性:
调节试试看,感受一下,利用CALayer可以实现怎样的效果。
注:图层不属于响应链(responder chain),无法像视图一样直接响应触摸和手势,我们在CALayerPlayground中见识过。不过图层有点击测试,后面的CATransformLayer会提到。你也可以向图层添加自定义动画,CAReplicatorLayer中会出现。