1.storyboard中加载一个view
2.demo示例1
/**
(1)values属性
values属性指明整个动画过程中的关键帧点,需要注意的是,起点必须作为values的第一个值。
(2)path属性
作用与values属性一样,同样是用于指定整个动画所经过的路径的。需要注意的是,values与path是互斥的,当values与path同时指定时,path会覆盖values,即values属性将被忽略。
*/
- (void)testMove
{
// CABasicAnimation fromValue --> toValue
CAKeyframeAnimation *anim = [CAKeyframeAnimation animation];
//CAKeyframeAnimation 可以有两个属性来执行动画 keyPath 和 values 它可以在多个值之间变化,而CABasicAnimation 只能在两个值之间执行动画
//values与path是互斥的,当values与path同时指定时,path会覆盖values,即values属性将被忽略。
anim.keyPath = @"position";
NSValue *v1 = [NSValue valueWithCGPoint:CGPointZero];
NSValue *v2 = [NSValue valueWithCGPoint:CGPointMake(100, 0)];
NSValue *v3 = [NSValue valueWithCGPoint:CGPointMake(100, 200)];
NSValue *v4 = [NSValue valueWithCGPoint:CGPointMake(0, 200)];
anim.values = @[v1, v2, v3, v4];
// anim.path =
// anim.keyTimes = @[@(0.5), @(0.25), @(0.25)]; //每一帧用的时间
anim.duration = 2.0;//动画执行时间
anim.removedOnCompletion = NO; //执行动画后不要移除
anim.fillMode = kCAFillModeForwards; //保持最新
[self.redView.layer addAnimation:anim forKey:nil];
}
#pragma mark 动画的代理方法 动画开始的时候调用
- (void)animationDidStart:(CAAnimation *)anim
{
NSLog(@"animationDidStart");
}
#pragma mark 动画结束的时候调用
- (void)animationDidStop:(CAAnimation *)anim finished:(BOOL)flag
{
NSLog(@"animationDidStop");
}
效果:
开始:
动画过程中
demo示例2:
-(void)testMove2{
// CAKeyframeAnimation *anim = [CAKeyframeAnimation animationWithKeyPath:@"position"];
CAKeyframeAnimation *anim = [CAKeyframeAnimation animation];
anim.keyPath = @"position";//改变位置
anim.removedOnCompletion = NO;
anim.fillMode = kCAFillModeForwards;
anim.duration = 2.0;
//创建一个路径
CGMutablePathRef path = CGPathCreateMutable();
//添加一个圆到这个路径
CGPathAddEllipseInRect(path, NULL, CGRectMake(100, 100, 200, 200));
anim.path = path;
CGPathRelease(path);
// 设置动画的执行节奏
// kCAMediaTimingFunctionEaseInEaseOut : 一开始比较慢, 中间会加速, 临近结束的时候, 会变慢
anim.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut];
anim.delegate = self;
[self.redView.layer addAnimation:anim forKey:nil];
}
效果: