34

CAKeyframeAnimation使って永遠に繰り返したいアニメーションがありrepeatCount = HUGE_VALFます。アニメーションの長さは2秒ですが、各サイクルの前に3秒休止したいと思います。

私がそれを行うことを考えることができる唯一の2つの方法は次のとおりです。

  1. アニメーション全体を最後の5秒間にし、keyTimesと値を追加して、5sアニメーションの最後の3秒間に探している一時停止を取得できるようにします。これはちょっとハッキーな感じがします。

  2. アニメーションを1回だけ繰り返してperformSelector:afterDelay:2から、アニメーションを再度実行するなどの方法を追加します。これも汚れた感じがします。またaddAnimation:、5秒ごとに電話をかける必要があることを意味しますが、パフォーマンスの観点から最適かどうかはわかりません。

私が見逃しているかもしれない別のオプションはありますか?これらの2つの方法の1つは他よりも優れていますか?

4

3 に答える 3

128

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"];
于 2013-03-03T23:39:47.590 に答える
8

Swift3でのsamvermetteの答え:

let animationGroup = CAAnimationGroup()
animationGroup.duration = 5;
animationGroup.repeatCount = .infinity

let easeOut = CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseOut)

let pulseAnimation = CABasicAnimation(keyPath: "transform.scale.xy")
pulseAnimation.fromValue = 0
pulseAnimation.toValue = 1.0
pulseAnimation.duration = 2
pulseAnimation.timingFunction = easeOut

animationGroup.animations = [pulseAnimation]

ringImageView.layer.add(animationGroup, forKey: "pulse")
于 2017-01-12T01:57:31.727 に答える
0

Swift4.2でテスト済み

次の拡張機能を実装するだけで、任意のUIコンポーネントで素晴らしいパルスアニメーションを取得できます

//MARK:- Pulse animation
extension UIView {
    
    func applyPulse(_ apply: Bool = true) {
        if apply {
            let animation = CABasicAnimation(keyPath: "transform.scale")
            animation.toValue = 1.5
            animation.duration = 0.8
            animation.timingFunction = CAMediaTimingFunction(name: CAMediaTimingFunctionName.easeOut)
            animation.autoreverses = true
            animation.repeatCount = Float.infinity
            self.layer.add(animation, forKey: "pulsing")
        } else {
            self.layer.removeAnimation(forKey: "pulsing")
        }
    }
}

使用法:

  1. 始めること

    yourUiComponent.applyPulse()

  2. 止まる

    yourUiComponent.applyPulse(false)

于 2019-04-17T00:33:09.757 に答える