CABasicAnimation
相当于只有两个关键帧的核心动画
动画设置的value不会改变原来的值。默认动画结束后恢复原来的值
动画暂停
- (void)pause {
// 取得指定图层动画的媒体时间,后面参数用于指定子图层,这里不需要
CFTimeInterval interval=[_layer convertTime:CACurrentMediaTime() fromLayer:nil];
// 设置时间偏移量,保证暂停时停留在旋转的位置
[_layer setTimeOffset:interval];
// 速度设置为0,暂停动画
_layer.speed=0;
}
动画恢复
- (void)resume {
// 获得暂停的时间
CFTimeInterval beginTime= CACurrentMediaTime()- _layer.timeOffset;
// 设置偏移量
_layer.timeOffset=0;
// 设置开始时间
_layer.beginTime=beginTime;
// 设置动画速度,开始运动
_layer.speed=1.0;
}
代码示例
初始化 CABasicAnimation
~~ CABasicAnimation *basicAnimation = [[CABasicAnimation alloc]init];
动画的类型(属性动画)用来做动画的属性名
~~ basicAnimation.keyPath = @"position";
动画的起始效果
~~ basicAnimation.fromValue
动画的最终效果
~~ basicAnimation.toValue = [NSValue valueWithCGPoint:CGPointMake(150, 400)];
设置重复次数, 永久的话设置为 HUGE_VALF
~~ basicAnimation.repeatCount = MAXFLOAT;
指定动画开始时间;从开始指定延迟几秒执行的话,请设置为「CACurrentMediaTime() + 秒数」的形式
~~ basicAnimation.beginTime = CACurrentMediaTime() + 2;
动画结束时是否执行逆动画
~~ basicAnimation.autoreverses = YES;
设定动画的速度变化 (先加速后减速)
~~ basicAnimation.timingFunction = [CAMediaTimingFunction functionWithName: kCAMediaTimingFunctionEaseInEaseOut];
通过贝塞尔差值,设置运动速度变化;工具 - 贝塞尔差值在线模拟
~~ basicAnimation.timingFunction = [CAMediaTimingFunction functionWithControlPoints:0 :0 :0 :0];
设置动画时间
~~ basicAnimation.duration = 3;
指定 CAAnimationDelegate 协议方法代理人
~~ basicAnimation.delegate = self;
动画结束后不恢复
~~ basicAnimation.removedOnCompletion = NO;
~~ basicAnimation.fillMode = kCAFillModeForwards;
fillMode
的作用就是决定当前对象过了非 active
时间段的行为,比如动画开始之前、动画开始之后。如果是一个动画 CAAnimation
,则需要将其 removedOnCompletion
设置为 NO
,不然 fillMode
不起作用
-
kCAFillModeRemoved - 这个是默认值,也就是说当动画开始前和动画结束后,动画对
layer
都没有影响,动画结束后,layer
会恢复到之前的状态 -
kCAFillModeForwards - 当动画结束后,
layer
会一直保持着动画最后的状态 -
kCAFillModeBackwards - 当动画开始前,你只要将动画加入了一个
layer
,layer
便立即进入动画的初始状态并等待动画开始。你可以这样设定测试代码,将一个动画加入一个layer
的时候延迟 5 秒执行。然后就会发现在动画没有开始的时候,只要动画被加入了layer
,layer
便处于动画初始状态 -
kCAFillModeBoth - 理解了上面两个,这个就很好理解了,这个其实就是上面两个的合成.动画加入后开始之前,
layer
便处于动画初始状态,动画结束后layer
保持动画最后的状态.
给layer添加动画
~~ [self.layer addAnimation:basicAnimation forKey:@"position"];