iOS动画——Core Animation详解

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保持动画最后的状态.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值