关键帧动画
layer上的关键帧动画和UIView上的关键帧动画略有不同,UIView关键帧动画是将一些独立的简单动画结合起来,它可以为不同的视图和属性设置动画,动画可以重叠和间断。
而CAKeyframeAnimation是为单个属性设置动画,你可以定义动画的关键点,但动画不能有任何重叠或者间断。虽然有限制,但效果会更好。
创建一个关键帧动画:
let wobble = CAKeyframeAnimation(keyPath: "transform.rotation")
wobble.duration = 0.25
wobble.repeatCount = 4
wobble.values = [0.0, -.pi/4.0, 0.0, .pi/4.0, 0.0]
wobble.keyTimes = [0.0, 0.25, 0.5, 0.75, 1.0]
heading.layer.add(wobble, forKey: nil)
这里创建了一个关键帧动画,前面一节我们创建的basic动画是通过fromValue和toValue来设置帧的位置,而CAKeyframeAnimation是通过values数组来定义关键帧的位置。values中的值表示:将图层从0°旋转到-45°(等于π/ 4),再回到0°,一直旋转到45°,最后回到0°。
keyTimes表示动画的values对应的关键时间,是一个基于duration的时间百分比,请确保开始时间和结束时间设置为0.0和1.0,以避免动画有任何跳跃。
结构体属性
除了可以直接设置values的值外,我们还可以利用NSValue,将结构体类型进行“包裹”使用。
let balloon = CALayer()
balloon.contents = UIImage(named: "balloon")!.cgImage
balloon.frame = CGRect(x: -50.0, y: 0.0, width: 50.0, height: 65.0)
view.layer.insertSublayer(balloon, below: username.layer)
let flight = CAKeyframeAnimation(keyPath: "position")
flight.duration = 12.0
flight.values = [
CGPoint(x: -50.0, y: 0.0),
CGPoint(x: view.frame.width + 50.0, y: 160.0),
CGPoint(x: -50.0, y: loginButton.center.y)
].map { NSValue(cgPoint: $0) }
flight.keyTimes = [0.0, 0.5, 1.0]
balloon.add(flight, forKey: nil)
balloon.position = CGPoint(x: -50.0, y: loginButton.center.y)