1. CAKeyframeAnimation动画
CAKeyframeAnimation 动画特点
相比UIKit关键帧动画,首先CAKeyframeAnimation动画不能重叠,动画与动画之间不能有嫌隙;其次CAKeyframeAnimation动画描述是单个属性的变化状态。
相比CABasicAnimation动画,CAKeyframeAnimation动画有更加丰富的动画过程,他不需要设置fromValue和toValue属性控制动画的开始和结束效果,而是通过values和keyTimes属性设置状态和到达状态的时间。
CAKeyframeAnimation效果
- 图层从45˚到-45˚经历了两个阶段,第一阶段从45˚旋转到22˚经历了0.67比重时间,第二阶段从22˚旋转到-45˚经历了0.33比重时间。
CAKeyframeAnimation动画示例
let wobble = CAKeyframeAnimation(keyPath: "transform.rotation")
wobble.duration = 0.25
wobble.repeatCount = 4 // 设置动画次数
wobble.values = [0.0, -CGFloat.pi/4, 0.0, CGFloat.pi/4, 0.0] // 设置动画状态
wobble.keyTimes = [0.0, 0.25, 0.5, 0.75, 1.0] // 设置动画比重时间
heading.layer.add(wobble, forKey: nil)
2. 处理动画struct属性
处理struct的起因
- Core Animation是基于C语言的Objective-C的框架,而Objective-C的API偏向于处理Object对象,所以struct实例需要一些特别的处理。
处理struct的方法
- NSValue以下init方法对struct进行包装
init(cgPoint: CGPoint)
init(cgSize: CGSize)
init(cgRect rect: CGRect)
init(caTransform3D: CATransform3D)
- NSValue包装实例
let move = CABasicAnimation(keyPath: "position")
move.duration = 1.0
move.fromValue = NSValue(cgPoint: CGPoint(x: 100.0, y: 100.0))
move.toValue = NSValue(cgPoint: CGPoint(x: 200.0, y: 200.0))