【iOS进阶】【核心动画】2-CAKeyframeAnimation

CAKeyframeAnimation提供关键帧支持,可以为动画层属性制定一个关键路径,路径可以是一个数组,保存动画的每一个阶段值和关键的帧动画次数和时间。

1、values

  values:就是上述的NSArray对象。里面的元素称为”关键帧”(keyframe)。

  动画对象会在指定的时间(duration)内,依次显示values数组中的每一个关键帧

//CAKeyframeAnimation能在任意多个值之间切换
    CAKeyframeAnimation *anim = [CAKeyframeAnimation animation];
    
    anim.keyPath = @"position";
    
    NSValue *v1 = [NSValue valueWithCGPoint:CGPointMake(0, 0)];
    NSValue *v2 = [NSValue valueWithCGPoint:CGPointMake(100, 0)];
    NSValue *v3 = [NSValue valueWithCGPoint:CGPointMake(0, 100)];
    NSValue *v4 = [NSValue valueWithCGPoint:CGPointMake(100, 100)];
    anim.values =@[v1,v2,v3,v4];
    
    anim.duration = 2.0;
    
    anim.removedOnCompletion = NO;
    anim.fillMode = kCAFillModeForwards;
    
    [self.blockView.layer addAnimation:anim forKey:nil];

2、path

  path:可以设置一个CGPathRef\CGMutablePathRef,让层跟着路径移动。

  path只对CALayer的anchorPoint和position起作用。如果你设置了path,那么values将被忽略

    CAKeyframeAnimation *anim = [CAKeyframeAnimation animation];
    
    anim.keyPath = @"position";
    anim.removedOnCompletion = NO;
    anim.fillMode = kCAFillModeForwards;
    anim.duration = 3.0;
    //设置监听
    anim.delegate = self;
    
    //创建一个路径
    CGMutablePathRef path = CGPathCreateMutable();
    //往路径里面添加一个圆
    CGPathAddEllipseInRect(path, NULL, CGRectMake(100, 100, 150, 150));
    
    //设置动画的路径
    anim.path = path;
    
    //Create创建的都要Release
    CGPathRelease(path);
    
    //设置动画的执行节奏
    anim.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseIn];
    
    [self.blockView.layer addAnimation:anim forKey:nil];

 3> 模拟图标抖动的示例

//定义角度制转换成弧度制的宏
#define
Angle2Radian(angle) (M_PI * ((angle)/180.0)) #import "ViewController.h" @interface ViewController () @property (weak, nonatomic) IBOutlet UIImageView *imageView; - (IBAction)start; - (IBAction)stop; @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; } - (IBAction)start {
CAKeyframeAnimation
*anim = [CAKeyframeAnimation animation]; anim.keyPath = @"transform.rotation"; anim.removedOnCompletion = NO; anim.fillMode = kCAFillModeForwards; anim.values = @[@(Angle2Radian(-10)),@(Angle2Radian(10)),@(Angle2Radian(-10))]; anim.duration = 0.3; //重复次数 anim.repeatCount = MAXFLOAT; [self.imageView.layer addAnimation:anim forKey:@"hehe"]; } - (IBAction)stop {
//根据key删除相应的动画 [self.imageView.layer removeAnimationForKey:
@"hehe"]; } @end

 

posted @ 2015-04-16 11:28  锟斤拷Dy  阅读(111)  评论(0)    收藏  举报