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