Core Animation 之一

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Core Animation 之一相关的知识,希望对你有一定的参考价值。

CAAnimation可分为四种:

1.CABasicAnimation

设定CALayer的keyPath相应属性的初始值、结束值、动画的时间

2.CAKeyframeAnimation

设定CALayer的frame的初始值、中间n个关键点的frame、结束值、动画的时间

上面两种都是CAPropertyAnimation的子类

3.CAAnimationGroup

将作用于同一个Layer上的所有动画都组合起来,可以同时执行多个动画

4.CATransition

转场动画

 

整理CABasicAnimation的使用

1 // 将视图作为属性方便后面执行多个不同动画
2 _myView = [[UIView alloc] init];
3 _myView.layer.position = CGPointMake(100, 100);
4 _myView.layer.bounds = CGRectMake(0, 0, 100, 100);
5 _myView.backgroundColor = [UIColor blueColor];
6 [self.view addSubview:_myView];
7 [_myView release];

 

 1 // 创建一个CABasicAnimation类型的动画对象并对CALayer的position属性执行动画
 2 CABasicAnimation *anim = [CABasicAnimation animationWithKeyPath:@"position"];
 3 
 4 // 动画持续1.5s
 5 anim.duration = 1.5;
 6 
 7 // position属性值从(50, 80)渐变到(300, 350)
 8 anim.fromValue = [NSValue valueWithCGPoint:CGPointMake(50, 80)];
 9 anim.toValue = [NSValue valueWithCGPoint:CGPointMake(300, 350)];
10 
11 // 设置动画的代理
12 anim.delegate = self;
13 
14 // 保持动画执行后的状态
15 anim.removedOnCompletion = NO;
16 anim.fillMode = kCAFillModeForwards;
17 
18 // 添加动画对象到myView的图层上
19 [_myView.layer addAnimation:anim forKey:@"translate"];
  • 上面实现了平移动画
  • 想要实现不同的效果,最关键的地方就是第2行CABasicAnimation对象的初始化方式中keyPath的设定。在ios中有不同的keyPath可以查看API文档搜索

    CABasicAnimation animationWithKeyPath Types

  • 第8、9行这里并不是直接使用CGPoint这种结构体类型,而是要先包装成NSValue对象后再使用。
  • 注意:如果将第9行的toValue换成byValue,代表CALayer从位置(50, 80)开始向右移动300、向下移动350,也就是移动到位置(350, 430)
  • 默认情况下,动画执行完毕后,动画会自动从CALayer上移除,CALayer又会回到原来的状态。为了保持动画执行后的状态,可以加入第15、16行代码

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

    下面来讲各个fillMode的意义 
    kCAFillModeRemoved 这个是默认值,也就是说当动画开始前和动画结束后,动画对layer都没有影响,动画结束后,layer会恢复到之前的状态 
    kCAFillModeForwards 当动画结束后,layer会一直保持着动画最后的状态 
    kCAFillModeBackwards 这个和kCAFillModeForwards是相对的,就是在动画开始前,你只要将动画加入了一个layer,layer便立即进入动画的初始状态并等待动画开始.你可以这样设定测试代码,将一个动画加入一个layer的时候延迟5秒执行.然后就会发现在动画没有开始的时候,只要动画被加入了layer,layer便处于动画初始状态 
    kCAFillModeBoth 理解了上面两个,这个就很好理解了,这个其实就是上面两个的合成.动画加入后开始之前,layer便处于动画初始状态,动画结束后layer保持动画最后的状态.

  • 第19行后面的@"translate"只是给动画对象起了个名称,以后可以调用CALayer的removeAnimationForKey:方法根据动画名称来移除相应的动画哦
  • 第12行后面的self是视图控制器。代理需要实现的方法:
 1 #pragma mark 动画开始
 2 - (void)animationDidStart:(CAAnimation *)anim {
 3 NSLog(@"动画开始了");
 4 }
 5 
 6 #pragma mark 动画结束
 7 - (void)animationDidStop:(CAAnimation *)anim finished:(BOOL)flag {
 8 // 查看一下动画执行完毕后的position值
 9 NSString *string = NSStringFromCGPoint(_myView.layer.position);
10 NSLog(@"动画结束了,position:%@", string);
11 }

 在实质上,图层的属性值还是动画执行前的初始值,并没有真正被改变。

CABasicAnimation *anim = [CABasicAnimation animationWithKeyPath:@"transform"];
anim.duration = 1;

CATransform3D form = CATransform3DMakeTranslation(350, 350, 0);
anim.toValue = [NSValue valueWithCATransform3D:form];

[_myView.layer addAnimation:anim forKey:nil];

 

CABasicAnimation *anim = [CABasicAnimation animationWithKeyPath:@"bounds"];
anim.duration = 2;

anim.toValue = [NSValue valueWithCGRect:CGRectMake(0, 0, 30, 30)];

[_myView.layer addAnimation:anim forKey:nil];

 

CABasicAnimation *anim = [CABasicAnimation animationWithKeyPath:@"transform"];
anim.duration = 1.5; // 动画持续1.5s

// CALayer的宽度从0.5倍变为2倍
// CALayer的高度从0.5倍变为1.5倍
anim.fromValue = [NSValue valueWithCATransform3D:CATransform3DMakeScale(0.5, 0.5, 1)];
anim.toValue = [NSValue valueWithCATransform3D:CATransform3DMakeScale(2, 1.5, 1)];

[_myView.layer addAnimation:anim forKey:nil];

以上是关于Core Animation 之一的主要内容,如果未能解决你的问题,请参考以下文章

iOS - Core Animation(核心动画)

ios之核心动画(Core Animation)

Core Animation简介

iOS-Core-Animation-Advanced-Techniques(原文来自cocoachina)

在 Core Animation 中为圆形箭头遮罩的长度设置动画

iOS Core Animation