iOS CAKeyframeAnimation关键帧动画

概述

作为新年的开篇文章,首先祝福各位同仁新年快乐,万事大吉,技术薪资更上一层楼。

本篇文章简单的介绍一下CAKeyframeAnimation关键帧动画,之前的一篇文章介绍过CABasicAnimation,这个关键帧动画和CABasicAnimation很像,甚至有过之而无不及。一起来看看吧。

CAKeyframeAnimation

An object that provides keyframe animation capabilities for a layer object.

为图层对象提供关键帧动画功能的对象。

我们可以使用继承的init(keyPath:)方法创建CAKeyframeAnimation对象,并制定keyPath和关键帧的数值,来控制时间和动画。

对于大多数类型的动画,可以使用valueskeyTimes属性来指定关键帧值。在动画过程中,Core Animation通过在我们提供的值之间插入中间值。如果我们对一个坐标点进行动画时,比如图层的位置,我们可以为这个坐标点指定一个路径,而不是单独的值。动画的节奏是由我们提供的时间信息控制的。

常用属性类型说明
values[Any]?指定关键帧的数值数组。
pathCGPath?动画路径。
keyTimes[NSNumber]?一个可选的NSNumber对象数组,定义了应用给定关键帧段的时间。
timingFunctions[CAMediaTimingFunction]?一个可选的CAMediaTimingFunction对象数组,定义了每个关键帧段的速度。
calculationModeCAAnimationCalculationMode

指定了如何计算中间关键帧值。主要针对的是每一帧的内容为一个座标点的情况,也就是对anchorPoint和position进行的动画。当在平面座标系中有多个离散的点的时候,可以是离散的,也可以直线相连后进行插值计算,也可以使用圆滑的曲线将他们相连后进行插值计算。默认值为linear

linear:简单的线性计算之间的关键帧值。当关键帧为座标点的时候,关键帧之间直接直线相连进行插值计算。

discrete:每个关键帧值依次使用,不计算插值值。

paced:动画均匀进行,而不是按keyTimes设置的或者按关键帧平分时间,此时keyTimes和timingFunctions无效。

cubic:对关键帧为座标点的关键帧进行圆滑曲线相连后插值计算。

cubicPaced:cubic的基础上使得动画运行变得均匀,就是系统时间内运动的距离相同,此时keyTimes以及timingFunctions也是无效的。

rotationModeCAAnimationRotationMode?

确定沿路径动画的对象是否旋转以匹配路径切线。默认值为nil,即不做任何旋转。

rotateAuto:自动旋转。

rotateAutoReverse:自动翻转。

说了这么多,看一个官方的demo:

    func keyFrameAnimation() {
        let colorKeyframeAnimation = CAKeyframeAnimation(keyPath: "backgroundColor")
        colorKeyframeAnimation.values = [UIColor.red.cgColor, UIColor.green.cgColor, UIColor.blue.cgColor]
        colorKeyframeAnimation.keyTimes = [0, 0.5, 1]
        colorKeyframeAnimation.duration = 2
        self.view.layer.add(colorKeyframeAnimation, forKey: nil)
    }

执行效果如下:

移动动画

    func positionChange() {
        let keyframeAnimation = CAKeyframeAnimation(keyPath: "position")
        keyframeAnimation.duration = 2.0
        keyframeAnimation.isRemovedOnCompletion = false
        keyframeAnimation.fillMode = .forwards
        keyframeAnimation.path = UIBezierPath(ovalIn: CGRect(x: 100, y: 150, width: 100, height: 100)).cgPath
        keyframeAnimation.repeatCount = 5
        animationLayer.add(keyframeAnimation, forKey: nil)
    }

执行效果如下:

抖动动画

    func shakeActionDemo() {
        let keyframeAnimation = CAKeyframeAnimation(keyPath: "transform.rotation")
        keyframeAnimation.duration = 0.3
        keyframeAnimation.values = [Double.pi/4, -Double.pi/4, Double.pi/4]
        keyframeAnimation.repeatCount = 6
        animationLayer.add(keyframeAnimation, forKey: nil)
    }

执行效果如下:

放缩动画

    func scaleActionDemo() {
        let keyframeAnimation = CAKeyframeAnimation(keyPath: "transform.scale")
        keyframeAnimation.duration = 0.5
        keyframeAnimation.values = [1.0, 1.5, 2.0, 1.5, 1.0]
        keyframeAnimation.repeatCount = 6
        animationLayer.add(keyframeAnimation, forKey: nil)
    }

执行效果如下:

更多keyPath请详见CABasicAnimation这篇文章。

小车移动的动画

    func carMoveDemo() {
        // 绘制线路
        let path = UIBezierPath()
        path.move(to: CGPoint(x: 40, y: 200))
        path.addCurve(to: CGPoint(x: 400, y: 200), controlPoint1: CGPoint(x: 150, y: 100), controlPoint2: CGPoint(x: 300, y: 300))
        
        let pathShape = CAShapeLayer()
        pathShape.path = path.cgPath
        pathShape.strokeColor = UIColor.red.cgColor
        pathShape.fillColor = nil
        self.view.layer.addSublayer(pathShape)
        
        let moveAnamation = CAKeyframeAnimation(keyPath: "position")
        moveAnamation.path = path.cgPath
        moveAnamation.duration = 2
        moveAnamation.rotationMode = .rotateAuto
        moveAnamation.isRemovedOnCompletion = false
        moveAnamation.fillMode = .forwards
        
        let carShape = CALayer()
        carShape.frame = CGRect(x: 40, y: 160, width: 30, height: 30)
        carShape.contents = UIImage(named: "car")?.cgImage
        carShape.anchorPoint = CGPoint(x: 0.5, y: 0.8)
        carShape.add(moveAnamation, forKey: nil)
        self.view.layer.addSublayer(carShape)
    }

CABasicAnimation与CAKeyframeAnimation区别

CAKeyframeAnimation可以说是CABasicAnimation的一个升级版。

CABasicAnimation只能从一个值变化到另一个值,而CAKeyframeAnimation提供了一个数组,里面提供可以提供一系列的关键值。

 

以上即是笔者对CAKeyframeAnimation动画的理解,如果不对的地方,还请路过的朋友多加指正,不喜勿喷噢!

本篇文章出自https://blog.csdn.net/guoyongming925的博客,如需转载,请标明出处。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值