【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