核心动画--基本动画
#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"]; }