#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"];}