CALayer都是实现了CAMediaTiming协议(或者叫做接口)。所以layer的动画有一个很有意思的属性speed。如果一个layer的动画速度变成0.0的时候,很显然这个动画就不再动了。设置layer的speed为0时,layer的动画暂停。speed属性设置为任意大于0的值时,动画回复。
-(void)pauseLayer:(CALayer*)layer {
CFTimeInterval pausedTime = [layer convertTime:CACurrentMediaTime() fromLayer:nil];
layer.speed = 0.0;
layer.timeOffset = pausedTime;
}
-(void)resumeLayer:(CALayer*)layer {
CFTimeInterval pausedTime = [layer timeOffset];
layer.speed = 1.0;
layer.timeOffset = 0.0;
layer.beginTime = 0.0;
CFTimeInterval timeSincePause = [layer convertTime:CACurrentMediaTime() fromLayer:nil] - pausedTime;
layer.beginTime = timeSincePause;
}

CABasicAnimation *sizeAnim = [CABasicAnimation animationWithKeyPath:@"transform"];
sizeAnim.fromValue = [NSValue valueWithCATransform3D:CATransform3DIdentity];
sizeAnim.toValue = [NSValue valueWithCATransform3D:CATransform3DMakeScale(1.5f, 1.5f, 1.f)];
sizeAnim.duration = .2f;
sizeAnim.fillMode = kCAFillModeForwards;
sizeAnim.removedOnCompletion = YES;
sizeAnim.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut];
[self.collectionImageView.layer addAnimation:sizeAnim forKey:@"size"];
CAKeyframeAnimation *shakeAnim = [CAKeyframeAnimation animationWithKeyPath:@"transform.rotation.z"];
shakeAnim.values = @[@(M_PI/6), @(-M_PI/6),@(M_PI/6)/*, @(-M_PI/6)*/];
shakeAnim.timingFunctions = @[[self getTiming:kCAMediaTimingFunctionLinear]
, [self getTiming:kCAMediaTimingFunctionLinear]
,[self getTiming:kCAMediaTimingFunctionLinear]];
shakeAnim.duration = .2f;
// shakeAnim.beginTime = CACurrentMediaTime() + sizeAnim.duration;
[self.collectionImageView.layer addAnimation:shakeAnim forKey:@"shake"];

上面说的ImageView可以通过self.collectionImageView来访问。这里设置的执行时间都不是很长,在实验的时候最好把动画的执行时间设置的长点。
static BOOL animationStoped = NO;
- (IBAction)animationAction:(id)sender {
if (!animationStoped) {
[self pauseLayer:self.collectionImageView.layer];
// animationStoped = YES;
}
else{
[self resumeLayer:self.collectionImageView.layer];
}
animationStoped = !animationStoped;
}