Core Animation创建动画不仅简单,而且具有更好的性能,原因如下
- Core Animation动画在单独的线程中完成,不会阻塞主线程
- Core Animation动画只会重绘界面上变化的部分(局部刷新)。
一、使用CALayer
Core Animation的核心是CALayer,每个UIView都有自己的CALayer,而且每个CALayer都可以不断的添加字CALayer,CALayer所在的CALayer被称为父CALayer,CALayer的这种组织被称为Layer Tree。
使用CALayer的简单步骤
1、创建一个CALayer
CALayer *subLayer = [CALayer layer];
2、设置CALayer的contents属性即可设置该CALayer所显示的内容(CGImage)
subLayer.contents = (id)[UIImage imageNamed:@"image"].CGImage;
3、设置CALayer的各种属性(backgroundColor、fram、position、anchor point/锚点、borderXxx/边框相关属性、shadowXxx/阴影相关属性 ==)
subLayer.backgroundColor = [UIColor magentaColor].CGColor;
subLayer.cornerRadius = 8;
subLayer.borderWidth = 4;
subLayer.borderColor = [UIColor blackColor].CGColor;
subLayer.shadowOffset = CGSizeMake(4, 5);
//设置阴影的模糊程度
subLayer.shadowRadius = 1;
subLayer.shadowColor = [UIColor blackColor].CGColor;
subLayer.shadowOpacity = 0.8;//透明度
subLayer.frame = CGRectMake(30, 30, 120, 160);
4、将该CALayer添加到父CALayer中即可
[self.view.layer addSublayer:subLayer];
二、使用CATransition控制过度动画
CATransition通常用于通过CALayer控制UIView内子控件的过渡动画,如删除子控件、添加子控件、切换两个子控件等。
使用步骤如下
1、创建CATransition对象
CATransition *transition = [CATransition animation];
2、设置动画时长
transition.duration = 2.0f;
3、为CATransition设置type和subtype两个属性,其中rype指定动画类型,subtype为指定动画移动方向
transition.type = @"oglFlip";
transition.subtype = kCATransitionFromBottom;
4、如果不需要动画执行整个过程。可以指定startProgress(开始进度)、endProgress(结束进度)属性
transition.startProgress = 0.5f;
transition.endProgress = 1.5f;
5、调用UIView的layer属性的addAnimation:forKey:方法控制该UIView内子控件的过渡动画。
[self.view.layer addAnimation:transition forKey:@"animation"];
三、使用属性动画
属性动画由CAPropertyAnimation代表,该对象用于控制CALayer的动画属性(所有支持数值型属性值的属性几乎都可作为动画属性)持续改变,当CALayer的动画属性持续改变时,CALayer的外观就会持续改变——用户看上去就变成了动画。
使用步骤如下
1、利用aninmationWithKeyPath类方法创建属性动画
CABasicAnimation *anim1 = [CABasicAnimation animationWithKeyPath:@"position"];
CAKeyframeAnimation *anim2 = [CAKeyframeAnimation animationWithKeyPath:@“transform"];
2、如果使用CABasicAnimation属性动画,则可指定framValue、toValue两个属性值,其中fromValue指定动画属性开始时的属性值,toValue指定动画属性结束时的属性值;如果用CAKeyframeAnimation属性动画,则指定values属性值,该属性值时一个NSArray属性,其中第一个元素指定动画属性开始时的属性值,toValue指定动画属性结束时的属性值,其他数组元素指定动画变化过程中的属性值。如有需要还可以指定其他动画属性值。
//使用CABasicAnimation属性动画
CGPoint toPoint = CGPointMake(fromPoint.x + 80, fromPoint.y );
anim1.fromValue = [NSValue valueWithCGPoint:fromPoint];
anim1.toValue = [NSValue valueWithCGPoint:toPoint];
anim1.duration = 0.5;
//使用CAKeyframeAnimation属性动画
anim2.values = [NSArray arrayWithObjects:[NSValue valueWithCATransform3D:_imageLayer.transform],
[NSValue valueWithCATransform3D:CATransform3DScale(_imageLayer.transform, 0.2, 0.2, 1)],
[NSValue valueWithCATransform3D:CATransform3DScale(_imageLayer.transform, 2, 2, 1)],
[NSValue valueWithCATransform3D:_imageLayer.transform], nil];
anim2.duration = 5;
3、调用CALayer的addAnimation:forKey:添加动画即可
[_imageLayer addAnimation:anim forKey:nil];
注意:关于动画结束后是否回到初始位置有以下两个属性
rotationAnimation.fillMode = kCAFillModeForwards; rotationAnimation.removedOnCompletion = NO;
设置这两个属性表示保持移动后的位置不变。
关于这两个属性的详细解释
fillMode的作用就是决定当前对象过了非active时间段的行为. 比如动画开始之前,动画结束之后。如果是一个动画CAAnimation,则需要将其removedOnCompletion设置为NO,要不然fillMode不起作用.
下面来讲各个fillMode的意义
kCAFillModeRemoved 这个是默认值,也就是说当动画开始前和动画结束后,动画对layer都没有影响,动画结束后,layer会恢复到之前的状态
kCAFillModeForwards 当动画结束后,layer会一直保持着动画最后的状态
kCAFillModeBackwards 这个和kCAFillModeForwards是相对的,就是在动画开始前,你只要将动画加入了一个layer,layer便立即进入动画的初始状态并等待动画开始.你可以这样设定测试代码,将一个动画加入一个layer的时候延迟5秒执行.然后就会发现在动画没有开始的时候,只要动画被加入了layer,layer便处于动画初始状态
kCAFillModeBoth 理解了上面两个,这个就很好理解了,这个其实就是上面两个的合成.动画加入后开始之前,layer便处于动画初始状态,动画结束后layer保持动画最后的状态.