#pragma mark - 当前视图被触摸
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
//1.判断myView.layer上是否添加了动画
CAAnimation *animation = [myView.layer animationForKey:@"rotationAnimation"];
if (animation) {
//2.判断是否暂停、恢复
if (myView.layer.speed == 0) {
//恢复动画
[self resumeAnimation];
} else {
//暂停动画
[self pauseAnimation];
}
} else {
[self rotationAnimation];
}
}
#pragma mark - 动画效果
//暂停动画
- (void)pauseAnimation {
//(0-5)
//开始时间:0
// myView.layer.beginTime
//1.取出当前时间,转成动画暂停的时间
CFTimeInterval pauseTime = [myView.layer convertTime:CACurrentMediaTime() fromLayer:nil];
//2.设置动画的时间偏移量,指定时间偏移量的目的是让动画定格在该时间点的位置
myView.layer.timeOffset = pauseTime;
//3.将动画的运行速度设置为0, 默认的运行速度是1.0
myView.layer.speed = 0;
}
//恢复动画
- (void)resumeAnimation {
//1.将动画的时间偏移量作为暂停的时间点
CFTimeInterval pauseTime = myView.layer.timeOffset;
//2.计算出开始时间
CFTimeInterval begin = CACurrentMediaTime() - pauseTime;
[myView.layer setTimeOffset:0];
[myView.layer setBeginTime:begin];
myView.layer.speed = 1;
}
//CABasicAnimation 实现旋转动画
- (void)rotationAnimation {
//1.创建动画对象
//默认是按Z轴旋转
CABasicAnimation *basic = [CABasicAnimation animationWithKeyPath:@"transform.rotation.z"];
//2.设置动画属性
[basic setToValue:@(2*M_PI)]; //2*M_PI 旋转一周
[basic setDuration:0.5f];
//动画完成后,是否从CALayer上移除动画对象
// [basic setRemovedOnCompletion:YES];
//设置重复次数,HUGE_VALF是一个非常大的浮点数
[basic setRepeatCount:HUGE_VALF];
//动画根据锚点旋转的
//修改锚点
[myView.layer setAnchorPoint:CGPointMake(0, 0)];
//3.添加动画
[myView.layer addAnimation:basic forKey:@"rotationAnimation"];
}
//CABasicAnimation 实现缩放动画
- (void)scaleAnimation {
//1.创建动画对象
CABasicAnimation *basic = [CABasicAnimation animationWithKeyPath:@"transform.scale"];
//2.设置动画的属性
//fromValue 、toValue
[basic setFromValue:@1];
[basic setToValue:@2];
//设置动画的时长
[basic setDuration:0.6f];
//是否自动恢复原始
// [basic setAutoreverses:YES];
basic.removedOnCompletion = NO;
basic.fillMode = kCAFillModeForwards;
//3.将动画添加到CALayer
[myView.layer addAnimation:basic forKey:nil];
}