layers 比 views 有更多的 animatable properties,layers 动画更灵活。
对 layers 的 position, size, or transform 进行动画处理同样会影响该层中的子视图,就像您直接对视图本身进行动画一样。
- bounds: 修改它使层的边框具有动画效果。
- position: 修改它使层在其父层中的位置具有动画效果。如果你只想一个轴进行动画,你可以分别设置 position.x or position.y。
- transform: 修改它使层 move, scale, and rotate 。你甚至可以在三维空间中对层进行动画处理,这是单凭视图是无法做到的。
我们可以很容易地动画 layer 的边界,以改变它的颜色,宽度和角的半径:
• borderColor: 修改它改变 border 颜色。 • borderWidth: 修改它以伸缩 border width。 • cornerRadius: 修改它改变 laye 的角半径。
Shadow
• shadowOffset: 修改它,使 shadow 接近或者远离 layer。 • shadowOpacity: : 修改它,使 shadow 淡入淡出。 • shadowPath: 修改它以改变 layer 的 shadow,我们可以创建 3D 特效让图层看起来像漂浮在不同的阴影形状和位置上。 • shadowRadius: 修改这个以控制阴影的模糊。
Contents
Contents• contents: 修改它,将原始 TIFF 或 PNG 数据分配为 层内容。 • mask: 修改它,建立形状或图像以用于屏蔽层的可见内容。 • opacity: 修改它改变图层内容的透明度。
以上所列只是我们可以动画的部分属性列表; CALayer的子类还有很多其它属性可以进行动画处理。
demo 实例
view 方式动画
UIView.animate(withDuration: 0.5) { self.heading.center.x += self.view.bounds.width}复制代码
可以 layer 方式实现
let flyRight = CABasicAnimation(keyPath: "position.x") flyRight.fromValue = -view.bounds.size.width/2 flyRight.toValue = view.bounds.size.width/2flyRight.duration = 0.5heading.layer.add(flyRight, forKey: nil)复制代码
add(_:forKey:) 拷贝一个动画对象,并告诉 Core animation 在图层上运行它。参数 key 允许您稍后识别动画。
More elaborate layer animations
let flyRight = CABasicAnimation(keyPath: "position.x") flyRight.fromValue = -view.bounds.size.width/2 flyRight.toValue = view.bounds.size.width/2 flyRight.duration = 0.5 flyRight.fillMode = kCAFillModeBoth flyRight.isRemovedOnCompletion = false heading.layer.add(flyRight, forKey: nil)复制代码
fillMode 的作用是决定当前对象过了非 active 时间段的行为. 比如动画开始之前,动画结束之后。
-
kCAFillModeRemoved 这个是默认值,动画开始前和动画结束后 , 动画对 layer 都没有影响,动画结束后 , layer 会恢复到之前的状态。
-
kCAFillModeForwards 当动画结束后, layer 会一直保持着动画最后的状态。
- kCAFillModeBackwards 这个和 kCAFillModeForwards 是相对的,就是在动画开始前,你只要将动画加入了一个 layer , layer 便立即进入动画的初始状态并等待动画开始。
- kCAFillModeBoth 理解了上面两个,这个就很好理解了,这个其实就是上面两个的合成.动画加入后开始之前,layer便处于动画初始状态,动画结束后layer保持动画最后的状态。该属性使动画的第一帧(first frame)立即显示在屏幕上,并使动画的最后一帧(the final frame)在动画结束后也显示在屏幕上。