Swift*CoreAnimation初学笔记



效果

CAAnimation可分为四种:

1.CABasicAnimation

通过设定起始点,终点,时间,动画会沿着你这设定点进行移动。可以看做特殊的CAKeyFrameAnimation

2.CAKeyframeAnimation

Keyframe顾名思义就是关键点的frame,你可以通过设定CALayer的始点、中间关键点、终点的frame,时间,动画会沿你设定的轨迹进行移动

3.CAAnimationGroup

Group也就是组合的意思,就是把对这个Layer的所有动画都组合起来。PS:一个layer设定了很多动画,他们都会同时执行,如何按顺序执行我到时候再讲。

4.CATransition

这个就是苹果帮开发者封装好的一些动画

上代码看效果:

CABasicAnimation

funccreateScaleLayer() {

//创建对象

letscaleLayer:CALayer=CALayer()

scaleLayer.backgroundColor=UIColor.blueColor().CGColor

scaleLayer.frame=CGRectMake(50,50,40,40)

scaleLayer.cornerRadius=20

self.view.layer.addSublayer(scaleLayer)

//创建动画

letscaleAnimation:CABasicAnimation=CABasicAnimation(keyPath:"transform.scale")


keyPath

scaleAnimation.fromValue=1.0//动画起始状态,当前是缩放动画,则表示缩放比例

scaleAnimation.toValue=1.5//动画终止状态,当前是缩放动画,表示放大1.5倍

scaleAnimation.autoreverses=false//动画结束后是否执行逆动画

scaleAnimation.fillMode=kCAFillModeForwards

/*

fillMode的作用就是决定当前对象过了非active时间段的行为.比如动画开始之前,动画结束之后。如果是一个动画CAAnimation,则需要将其removedOnCompletion设置为NO,要不然fillMode不起作用.下面来讲各个fillMode的意义

kCAFillModeRemoved这个是默认值,也就是说当动画开始前和动画结束后,动画对layer都没有影响,动画结束后,layer会恢复到之前的状态

kCAFillModeForwards当动画结束后,layer会一直保持着动画最后的状态

kCAFillModeBackwards这个和kCAFillModeForwards是相对的,就是在动画开始前,你只要将动画加入了一个layer,layer便立即进入动画的初始状态并等待动画开始.你可以这样设定测试代码,将一个动画加入一个layer的时候延迟5秒执行.然后就会发现在动画没有开始的时候,只要动画被加入了layer,layer便处于动画初始状态

kCAFillModeBoth理解了上面两个,这个就很好理解了,这个其实就是上面两个的合成.动画加入后开始之前,layer便处于动画初始状态,动画结束后layer保持动画最后的状态.

*/

scaleAnimation.repeatCount=MAXFLOAT//动画重复次数

scaleAnimation.duration=0.8//完成一次动画的时间

//开始执行

scaleLayer.addAnimation(scaleAnimation, forKey:"scaleAnimation")

}

CAKeyFrameAnimation

CAKeyFrameAnimation则更复杂一些,允许我们在起点与终点间自定义更多内容来达到我们的实际应用需求!

funccreateRectLayer() {

rectLayer.frame=CGRectMake(20,50,40,40)

rectLayer.cornerRadius=20//圆

rectLayer.backgroundColor=UIColor.purpleColor().CGColor

self.view.layer.addSublayer(rectLayer)

letrectRunAnimation:CAKeyframeAnimation=CAKeyframeAnimation(keyPath:"position")

//设定关键帧的位置一个循环必须包含其实与终止位置所以矩形则是a->b->c->d->a

rectRunAnimation.values= [NSValue(CGPoint:rectLayer.frame.origin),NSValue(CGPoint:CGPointMake(300,rectLayer.frame.origin.y)),NSValue(CGPoint:CGPointMake(300,rectLayer.frame.origin.y+100)),NSValue(CGPoint:CGPointMake(20,rectLayer.frame.origin.y+100)),NSValue(CGPoint:rectLayer.frame.origin)]

letlabel:UILabel=UILabel(frame:CGRect(x:20, y:50, width:280, height:100))

label.text=""

label.layer.borderWidth=3

label.layer.borderColor=UIColor.redColor().CGColor

self.view.addSubview(label)

/*

1)values属性

values属性指明整个动画过程中的关键帧点,例如上例中的A-E就是通过values指定的。需要注意的是,起点必须作为values的第一个值。

(2)path属性

作用与values属性一样,同样是用于指定整个动画所经过的路径的。需要注意的是,values与path是互斥的,当values与path同时指定时,path会覆盖values,即values属性将被忽略。

*/

letpath:CGMutablePathRef=CGPathCreateMutable()

CGPathMoveToPoint(path,nil,rectLayer.position.x-20,rectLayer.position.y-20)

CGPathAddLineToPoint(path,nil,300,rectLayer.frame.origin.y)

CGPathAddLineToPoint(path,nil,300,rectLayer.frame.origin.y+300)

CGPathAddLineToPoint(path,nil,20,rectLayer.frame.origin.y+300)

CGPathAddLineToPoint(path,nil,20,rectLayer.frame.origin.y)

rectRunAnimation.path= path

letlabel1:UILabel=UILabel(frame:CGRect(x:20, y:50, width:280, height:300))

label1.text=""

label1.layer.borderWidth=1.5

label1.layer.borderColor=UIColor.greenColor().CGColor

self.view.addSubview(label1)

//设置每个关键帧的时长,不设置则默认时间duration/(values.count - 1)

/*

keyTimes属性该属性是一个数组,用以指定每个子路径(AB,BC,CD)的时间。如果你没有显式地对keyTimes进行设置,则系统会默认每条子路径的时间为:ti=duration/(5-1),即每条子路径的duration相等,都为duration的1\4。当然,我们也可以传个数组让物体快慢结合。

*/

rectRunAnimation.keyTimes= [0,0.6,0.7,0.8,1]

/*

timeFunctions属性

这个属性用以指定时间函数,类似于运动的加速度,有以下几种类型。上例子的AB段就是用了淡入淡出效果。记住,这是一个数组,你有几个子路径就应该传入几个元素

1 kCAMediaTimingFunctionLinear//线性

2 kCAMediaTimingFunctionEaseIn//淡入

3 kCAMediaTimingFunctionEaseOut//淡出

4 kCAMediaTimingFunctionEaseInEaseOut//淡入淡出

5 kCAMediaTimingFunctionDefault//默认

*/

rectRunAnimation.timingFunctions= [CAMediaTimingFunction(name:kCAMediaTimingFunctionEaseOut),CAMediaTimingFunction(name:kCAMediaTimingFunctionLinear),CAMediaTimingFunction(name:kCAMediaTimingFunctionLinear),CAMediaTimingFunction(name:kCAMediaTimingFunctionLinear)]

rectRunAnimation.repeatCount=2000

rectRunAnimation.autoreverses=false

/*

calculationMode属性

该属性决定了物体在每个子路径下是跳着走还是匀速走,跟timeFunctions属性有点类似

kCAAnimationLinear//线性,默认

kCAAnimationDiscrete//离散,无中间过程,但keyTimes设置的时间依旧生效,物体跳跃地出现在各个关键帧上

kCAAnimationPaced//平均,keyTimes跟timeFunctions失效

kCAAnimationCubic//平均,同上

kCAAnimationCubicPaced//平均,同上

*/

rectRunAnimation.calculationMode=kCAAnimationLinear

rectRunAnimation.duration=5

rectLayer.addAnimation(rectRunAnimation, forKey:"rectRunAnimation")

}

具体的用法及属性在注释中已经解释,demo地址:fight-ing/CoreAnimationTestDemo · GitHub

学习自:编程小翁@博客园【原】iOSCoreAnimation动画系列教程(二):CAKeyFrameAnimation【包会】 - 编程小翁 - 博客园 

猜你喜欢

转载自blog.csdn.net/fengzhixinfei/article/details/50275583