动画:Core Animation

UIView 可实现一般动画,如果更复杂动画,需要用core animation


动画:Core Animation_第1张图片

core animation基于openGL 和 core graphics。

Core Animation是一套包含图形绘制、投影、动画的Objective-C类集合,该框架包含在QuartzCore.framework中,它因为被用于处理更为强大的平滑的转场效果而引入OS X Leopard和iOS而出名。

QuartzCore /Quartz 2D  基于core graphics;

CALayer

Layer Classes是core animation的基础。Layer Classes提供了一个抽象的概念,这个概念对于那些使用NSview和UIview的开发者来说是很熟悉的。基础层是由CAlayer类提供的,CAlayer是所有Core Animation层的父类。

同一个视图类的实例一样,一个CAlayer实例也有一个单独的superlayer和上面所有的子层(sublayers),它创建了一个有层次结构的层,我们称之为layer tree。layers的绘制就像views一样是从后向前绘制的,绘制的时候我们要指定其相对与他们的superlayer的集合形状,同时还需要创建一个局部的坐标系。layers可以做一些更复杂的操作,例如rotate(旋转),skew(倾斜),scale(放缩),和project the layer content(层的投影)。

巴拉巴拉那么多,其实CALayer是个简单的类,它是用来在屏幕上显示内容展示的矩形区域。那么和UIView区别是什么?

1.每个UIView 都有 CALayer,即 UIView.layer或者[UIView layer] ,这个layer叫做root layer。

2.UIView可以响应事件,而CALayer只负责显示。(UIView是有delegate的CALayer)

3.CALayer 有两个属性,position(相对于父类的位置)、anchorPoint(锚点,x范围0~1,y范围0~1,决定图层身上的哪个点会在position所指的位置),锚点在旋转的时候作为支点;

注:frame:(x,y,with,height)  = bounds(x,y,width,height) + position(x,y)+锚点


CAAnimation

CAAnimation分为这4种,他们分别是

1.CABasicAnimation

通过设定起始点,终点,时间,动画会沿着你这设定点进行移动。

2.CAKeyframeAnimation

Keyframe顾名思义就是关键点的frame,你可以通过设定CALayer的始点、中间关键点、终点的frame,时间,动画会沿你设定的轨迹进行移动,也就是说它可以把一个baseAnimation分成多个点和多个时间段来执行;

3.CAAnimationGroup

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

4.CATransition

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



动画:Core Animation_第2张图片



动画:Core Animation_第3张图片


动画:Core Animation_第4张图片


动画:Core Animation_第5张图片

(1)values属性

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

(2)path属性

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

animationWithKeyPath



kCAMediaTimingFunctionLinear//线性

kCAMediaTimingFunctionEaseIn//淡入

kCAMediaTimingFunctionEaseOut//淡出

kCAMediaTimingFunctionEaseInEaseOut//淡入淡出

kCAMediaTimingFunctionDefault//默认

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

kCAAnimationLinear//线性,默认

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

kCAAnimationPaced//平均,keyTimes跟timeFunctions失效

kCAAnimationCubic//平均,同上

kCAAnimationCubicPaced//平均,同上



动画:Core Animation_第6张图片

//缩放

CABasicAnimation*animation = [CABasicAnimationanimationWithKeyPath:@"transform.scale"];

animation.duration=5;

animation.fromValue= [NSNumbernumberWithFloat:1.0];

animation.toValue= [NSNumbernumberWithFloat:0.2];

animation.autoreverses=YES;

animation.repeatCount=MAXFLOAT;

//沿贝塞尔路径的动画,另外一种实现:用CAShapeLayer设置path

UIBezierPath*path = [UIBezierPathbezierPathWithArcCenter:CGPointMake(100,100)radius:100startAngle:-M_PI_2endAngle:M_PI*2clockwise:YES];

CAKeyframeAnimation*animation2 = [CAKeyframeAnimationanimationWithKeyPath:@"position"];

animation2.path= path.CGPath;

animation2.rotationMode=kCAAnimationRotateAuto;

//动画组

CAAnimationGroup*group = [CAAnimationGroupanimation];

group.animations= [NSArrayarrayWithObjects:animation,animation2,nil];

group.duration=5;

group.repeatCount=MAXFLOAT;

[view.layeraddAnimation:groupforKey:@"group"];



动画:Core Animation_第7张图片

你可能感兴趣的:(动画:Core Animation)