ios开发之--CAKeyframeAnimation的详细用法

简单的创建一个带路径的动画效果,比较粗糙,不过事先原理都是一样的,

代码如下:

1,创建动画所需的view

-(void)creatView
{
    moveView = [UIView new];
    
    moveView.backgroundColor = [UIColor purpleColor];
    
    moveView.frame = CGRectMake(0, 0, 30, 30);
    
    [self.view addSubview:moveView];
}

2,动画的实现:

方法一:

-(void)startAnimation
{
//    方法一 用法1​ Value方式
    //创建动画对象
    
    CAKeyframeAnimation *animation = [CAKeyframeAnimation animationWithKeyPath:@"position"];
    
    //设置value
    
    NSValue *value1=[NSValue valueWithCGPoint:CGPointMake(100, 100)];
    
    NSValue *value2=[NSValue valueWithCGPoint:CGPointMake(200, 100)];
    
    NSValue *value3=[NSValue valueWithCGPoint:CGPointMake(200, 200)];
    
    NSValue *value4=[NSValue valueWithCGPoint:CGPointMake(100, 200)];
    
    NSValue *value5=[NSValue valueWithCGPoint:CGPointMake(100, 300)];
    
    NSValue *value6=[NSValue valueWithCGPoint:CGPointMake(200, 400)];
    
    animation.values=@[value1,value2,value3,value4,value5,value6];
    
    //重复次数 默认为1
    
    animation.repeatCount=MAXFLOAT;
    
    //设置是否原路返回默认为不
    
    animation.autoreverses = YES;
    
    //设置移动速度,越小越快
    
    animation.duration = 4.0f;
    
    animation.removedOnCompletion = NO;
    
    animation.fillMode = kCAFillModeForwards;
    
    animation.timingFunction=[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut];
    
    animation.delegate=self;
    
    //给这个view加上动画效果
    
    [moveView.layer addAnimation:animation forKey:nil];

}

方法二:

//    用法2​  Path方式
    
    //创建动画对象
    
    CAKeyframeAnimation *animation = [CAKeyframeAnimation animationWithKeyPath:@"position"];
    
    //创建一个CGPathRef对象,就是动画的路线
    
    CGMutablePathRef path = CGPathCreateMutable();
    
    //自动沿着弧度移动
    
    CGPathAddEllipseInRect(path, NULL, CGRectMake(150, 200, 200, 100));
    
    //设置开始位置
    
    CGPathMoveToPoint(path,NULL,100,100);
    
    //沿着直线移动
    
    CGPathAddLineToPoint(path,NULL, 200, 100);
    
    CGPathAddLineToPoint(path,NULL, 200, 200);
    
    CGPathAddLineToPoint(path,NULL, 100, 200);
    
    CGPathAddLineToPoint(path,NULL, 100, 300);
    
    CGPathAddLineToPoint(path,NULL, 200, 400);
    
    //沿着曲线移动
    
    CGPathAddCurveToPoint(path,NULL,50.0,275.0,150.0,275.0,70.0,120.0);
    
    CGPathAddCurveToPoint(path,NULL,150.0,275.0,250.0,275.0,90.0,120.0);
    
    CGPathAddCurveToPoint(path,NULL,250.0,275.0,350.0,275.0,110.0,120.0);
    
    CGPathAddCurveToPoint(path,NULL,350.0,275.0,450.0,275.0,130.0,120.0);
    
    animation.path=path;
    
    CGPathRelease(path);
    
    animation.autoreverses = YES;
    
    animation.repeatCount=MAXFLOAT;
    
    animation.removedOnCompletion = NO;
    
    animation.fillMode = kCAFillModeForwards;
    
    animation.duration = 4.0f;
    
    animation.timingFunction=[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut];
    
    animation.delegate=self;
    
    [moveView.layer addAnimation:animation forKey:nil];
}

按照上面的方法,即可实现一个动画,参照上面的逻辑可以实现添加购物车,删除等带路径的动画!

下面附一个添加购物车的动画效果:

1,创建动画view

-(void)relodata
{
    self.addCartImg = [[UIImageView alloc] initWithFrame:CGRectMake(self.view.frame.size.width/4, self.view.frame.size.height+10, 30, 30)];
    self.addCartImg.hidden = true;
    [self.view addSubview:self.addCartImg];
    self.addCartImg.image = [UIImage imageNamed:@"3.jpg"];
}

2,具体动画的实现:

- (IBAction)clickAddShopCartBtn:(id)sender {
    
    self.addCartImg.hidden = false;
//    创建动画对象
    CAKeyframeAnimation *keyframeAnimation=[CAKeyframeAnimation animationWithKeyPath:@"position"];
//    创建一个CGPathRef对象,就是动画的路线
    CGMutablePathRef path = CGPathCreateMutable();
//    设置开始位置
    CGPathMoveToPoint(path, NULL, self.addCartImg.layer.position.x-40, self.addCartImg.layer.position.y-40);//移动到起始点
//    沿着路径添加四曲线点移动
    CGPathAddQuadCurveToPoint(path, NULL, 100, 100, self.view.frame.size.width, 0);
    keyframeAnimation.path = path;
    keyframeAnimation.delegate = self;
    CGPathRelease(path);
    keyframeAnimation.duration = 0.7;
    [self.addCartImg.layer addAnimation:keyframeAnimation forKey:@"KCKeyframeAnimation_Position"];
    
//    旋转动画
    CABasicAnimation* rotationAnimation;
    rotationAnimation = [CABasicAnimation animationWithKeyPath:@"transform.rotation.z"];
    rotationAnimation.toValue = [NSNumber numberWithFloat: M_PI * 2.0 ];
    rotationAnimation.duration = 0.1;
    rotationAnimation.cumulative = YES;
    rotationAnimation.repeatCount = 50;
    
//    为addCartImg添加旋转动画
    [self.addCartImg.layer addAnimation:rotationAnimation forKey:@"rotationAnimation"];
}

点击按钮,addCartImg会做一个旋转操作,并按照规定的路径进行移动,从而完成一个动画!

原文地址:https://www.cnblogs.com/hero11223/p/7211567.html