#pragma mark 动画暂停
- (void)pauseAnimation
{
// 1. 取出当前的动画的时间点,就是要暂停的时间点
CFTimeInterval pauseTime = [self.myView.layer convertTime:CACurrentMediaTime() fromLayer:nil];
// 2. 设置动画的时间偏移量,指定时间偏移量的目的是让动画定格在该时间点
[self.myView.layer setTimeOffset:pauseTime];
// 3. 将动画的运行速度设置为0,动画默认的运行速度是1.0
[self.myView.layer setSpeed:0.0];
}
#pragma mark 恢复动画
- (void)resumeAnimation
{
// 1. 将动画的时间偏移量作为暂停时的时间点
CFTimeInterval pauseTime = self.myView.layer.timeOffset;
// 2. 根据媒体时间计算出准确的启动动画时间,对之前暂停动画的时间进行修正
CFTimeInterval beginTime = CACurrentMediaTime() - pauseTime;
// 3. 要把偏移时间清零
[self.myView.layer setTimeOffset:0.0];
// 4. 设置图层的开始动画时间
[self.myView.layer setBeginTime:beginTime];
[self.myView.layer setSpeed:1.0];
}
注意:
// 对于循环播放的动画效果,一定要将removedOnCompletion设置为NO,否则无法恢复动画
[anim setRemovedOnCompletion:NO];
#pragma mark 旋转动画
- (void)rotationAnimation
{
// 1. 实例化基本动画
// 默认按照z轴旋转
CABasicAnimation *anim = [CABasicAnimation animationWithKeyPath:@"transform.rotation.z"];
[self.myView.layer setAnchorPoint:CGPointMake(0, 0)];
// 2. 设置动画属性
// 不停的旋转
// 1) 旋转一周
[anim setToValue:@(2 * M_PI)];
// 2) 不停的旋转 - 动画循环播放
// HUGE_VALF 是一个非常大得浮点数,指定此数值可以认为动画无限循环
// MAXFLOAT
[anim setRepeatCount:HUGE_VALF];
[anim setDuration:0.5f];
// 3) 动画完成时删除
// 对于循环播放的动画效果,一定要将removedOnCompletion设置为NO,否则无法恢复动画
[anim setRemovedOnCompletion:NO];
// 3. 添加动画
// key可以随便指定,用于判断图层中是否存在该动画
[self.myView.layer addAnimation:anim forKey:@"rotationAnim"];
}