首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如果为CAEmitterLayer设置了基本动画,则CAEmitterLayer不会添加基本动画

如果为CAEmitterLayer设置了基本动画,则CAEmitterLayer不会添加基本动画
EN

Stack Overflow用户
提问于 2017-03-29 14:32:00
回答 2查看 1.2K关注 0票数 2

我正试图用CAEmitterLayer和几个CAEmitterCell来模拟爆炸。这应该发生在用户看到视图后的短暂延迟之后。我用viewDidAppear启动我的动画。

粒子动画本身很好,但是就像这个问题一样,Initial particles from CAEmitterLayer don't start at emitterPosition,除非我将emitterLayer.beginTime = CACurrentMediaTime()动画设置为用户已经运行了一段时间的动画。

为了真正实现爆炸,我必须在某一时刻停止发射粒子。我尝试使用这段代码来设置CABasicAnimation,这将在一段时间后停止发射器:

代码语言:javascript
复制
// 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。我有animationDidStopanimationDidStart的日志,它们什么都不打印。

现在,如果我在按钮点击上调用explode函数,我就会看到没有任何粒子动画,但是在日志中我看到了“动画开始”/“动画停止”消息。

知道为什么吗?

EN

回答 2

Stack Overflow用户

发布于 2017-08-08 22:41:39

我发现了两个问题,使动画无法正常工作。

  1. 动画在birthRate上,但是CAEmitterLayer没有birthRate属性;但是CAEmitterCell有。给您的CAEmitterCell命名并将CABasicAnimation(keyPath: "birthRate")更改为CABasicAnimation(keyPath: "emitterCells.cellName.birthRate")
  2. 将beginTime设置为CACurrentMediaTime() + 1.0并不能满足您的要求,因为发射器层有自己的时间范围。将其更改为emitterLayer.convertTime(CACurrentMediaTime(), from: nil) + 1.0可以实现您想要的效果。
票数 3
EN

Stack Overflow用户

发布于 2018-08-04 16:58:32

聚会晚了,但我遇到了同样的事情,解决办法是将发射器的beginTime设置为CACurrentMediaTime(),例如:

代码语言:javascript
复制
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)

基本原理是发射器预先生成粒子来模仿它已经运行了一段时间.也见this SO question,它把我带到了解决方案。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43096533

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档