2

CAEmitterLayerといくつかの で爆発をアニメーション化しようとしていCAEmitterCellます。これは、ユーザーがビューを表示した後、少し遅れて発生するはずです。でアニメーションを開始しviewDidAppearます。

パーティクル アニメーション自体は正常に動作しますが、この質問のように、アニメーションがしばらく実行されているものとしてユーザーに表示されるように設定しない限り、CAEmitterLayer からの初期パーティクルはエミッタ位置で開始されません。emitterLayer.beginTime = CACurrentMediaTime()

実際に爆発を起こすには、ある時点でパーティクルの放出を停止する必要があります。このコードを使用してCABasicAnimation、しばらくするとエミッターを停止するセットアップを試みます。

// emitter layer is reused (remove all animations, remove all cells, remove from superlayer)
... // emitter layer setup in a function "explode" which is called from viewDidAppear
emitterLayer.beginTime = CACurrentMediaTime()

let birthRateAnimation = CABasicAnimation(keyPath: "birthRate")
birthRateAnimation.toValue = 0
birthRateAnimation.timingFunction = CAMediaTimingFunction.init(name:kCAMediaTimingFunctionEaseOut)
birthRateAnimation.beginTime = CACurrentMediaTime() + 1
birthRateAnimation.duration = 5
birthRateAnimation.delegate = self // (self is view controller)
birthRateAnimation.setValue("expl", forKey: "animName")

emitterLayer.add(birthRateAnimation, forKey: "birthRateAnimation")
self.view.layer.addSublayer(emitterLayer)

したがって、このコードbirthRateAnimationでは実際にはトリガーされません。ログインしanimationDidStopていますが、animationDidStart何も印刷されません。

ここで、explodeボタン タップで関数を呼び出すと、パーティクル アニメーションはまったく表示れませんが、ログには「アニメーション開始」/「アニメーション停止」メッセージが表示されます。

理由はありますか?

4

2 に答える 2

1

パーティーに遅れましたが、まったく同じことに遭遇しました。解決策はbeginTime、エミッターをに設定することですCACurrentMediaTime()

let emitter = makeAwesomeEmitter()
emitter.beginTime = CACurrentMediaTime()

let emitterAnimation = makeAwesomeEmitterBirthRateAnimation()
emitterAnimation.beginTime = 1.0 // 1 sec delay
emitter.add(emitterAnimation, forKey: nil)

myView.layer.addSublayer(emitter)

理論的根拠は、エミッターがパーティクルを事前に生成して、しばらくの間実行されていることを模倣することです。私を解決に導いたこのSOの質問も参照してください。

于 2018-08-04T16:58:32.870 に答える