我有一个CAKeyframeAnimation动画,我想使用repeatCount = HUGE_VALF重复一遍。动画的持续时间为2秒,但我想在每个循环前暂停3秒。

我可以想到的仅有2种方法是:

  • 使整个动画持续5秒钟,并添加额外的keyTimes和值,以便在5s动画的最后3s中获得所需的暂停。这感觉有点骇人听闻。
  • 让动画只重复一次,然后添加诸如performSelector:afterDelay:2之类的东西来再次运行动画,依此类推。这也很脏。这也意味着我需要每5秒调用一次addAnimation:,我不确定这在性能上是否最佳。

  • 我还有其他选择吗?这两种方法中的一种优于另一种吗?

    最佳答案

    通过转储Apple的MKUserLocationView的动画,我能够看到它们的运行方式。原来,这就是CAAnimationGroup的用途。通过将2秒的动画封装到5秒的动画组中,您将得到2秒的动画和3秒的延迟:

    CAAnimationGroup *animationGroup = [CAAnimationGroup animation];
    animationGroup.duration = 5;
    animationGroup.repeatCount = INFINITY;
    
    CAMediaTimingFunction *easeOut = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseOut];
    
    CABasicAnimation *pulseAnimation = [CABasicAnimation animationWithKeyPath:@"transform.scale.xy"];
    pulseAnimation.fromValue = @0.0;
    pulseAnimation.toValue = @1.0;
    pulseAnimation.duration = 2;
    pulseAnimation.timingFunction = easeOut;
    
    animationGroup.animations = @[pulseAnimation];
    
    [ringImageView.layer addAnimation:animationGroup forKey:@"pulse"];
    

    10-08 07:53