CAKeyframeAnimation动画的使用

本文介绍了如何使用CAKeyframeAnimation来创建动画效果,包括通过动画路径和动画数组两种方式。特别强调当同时设置两者时,动画路径将优先执行,导致动画数组设置无效。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

/**
 *  CAKeyframeAnimation动画
 *
 *  @param view      添加动画效果的UIView
 *  @param keyPath   动画类型
 *  @param values    动画效果Values方式
 *  @param refPath   动画效果path方式
 *  @param duration  动画时间,默认0.3
 *  @param repeat    动画执行次数,默认1
 *  @param isRemoved 动画结束后是否恢复原样
 *  @param function  动画函数名称kCAMediaTimingFunctionLinear
 *                             kCAMediaTimingFunctionEaseIn
 *                             kCAMediaTimingFunctionEaseOut
 *                             kCAMediaTimingFunctionEaseInEaseOut
 *                             kCAMediaTimingFunctionDefault
 */
+ (void)keyframeAnimation:(UIView *)view
                  keyPath:(NSString *)keyPath
                   values:(NSArray *)values
                  refPath:(CGPathRef)refPath
                 duration:(NSTimeInterval)duration
              repeatCount:(NSInteger)repeat
        removedCompletion:(BOOL)isRemoved
           timingFunction:(NSString *)function
{
    /*
     围绕x轴翻转 transform.rotation.x
     围绕y轴翻转 transform.rotation.y
     围绕z轴翻转 transform.rotation.z
     x方向缩放 transform.scale.x
     y方向缩放transform.scale.y
     z方向缩放transform.scale.z
     所有方向缩放 transform.scale
     x方向移动 transform.translation.x
     y方向移动 transform.translation.y
     z方向移动 transform.translation.z
     移动 transform.translation
     移动 @"position"
    */
    CAKeyframeAnimation *animation = [CAKeyframeAnimation animation];
    animation.keyPath = keyPath;
    
    if (values && 0 != values.count)
    {
        animation.values = values;
    }
    if (refPath)
    {
        animation.path = refPath;
    }    
    
    animation.repeatCount = (0 >= repeat ? 1 : repeat);
    animation.removedOnCompletion = isRemoved;
    animation.fillMode = kCAFillModeForwards;
    animation.duration = (0 >= duration ? 0.3 : duration);
    animation.timingFunction = [CAMediaTimingFunction functionWithName:function];
    
    [view.layer addAnimation:animation forKey:nil];
}


使用示例

// 贝塞尔曲线路径pah
UIBezierPath *path = [UIBezierPath bezierPath];
[path moveToPoint:CGPointMake(10.0, 10.0)];
[path addQuadCurveToPoint:CGPointMake(100, 300) controlPoint:CGPointMake(300, 100)];
// Values方式
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, 100)];
NSArray *values = @[value1, value2, value3, value4, value5];
        
[self keyframeAnimation:animationImageView keyPath:@"position" values:values refPath:path.CGPath duration:0.6 repeatCount:1 removedCompletion:NO timingFunction:kCAMediaTimingFunctionEaseInEaseOut];

注意事项:

动画效果有两种方式实现,一是通过动画路径,二是通过动画数组。

在设置过程中,如果同时设置了动画路径和动画数组,则默认会设置动画路径,即动画数组失效。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

番薯大佬

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值