/**
* 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];
注意事项:
动画效果有两种方式实现,一是通过动画路径,二是通过动画数组。
在设置过程中,如果同时设置了动画路径和动画数组,则默认会设置动画路径,即动画数组失效。