来自CAEmitterLayer的初始粒子不会从emitterPosition开始

我的目标是制作一个类似爆炸的animation,在短时间内发射很​​多粒子。 我的问题是,CAEmitterLayer开始发射时会添加“未来”粒子,使其看起来像animation已经运行了一段时间。

我怎样才能禁用或解决这个问题? 当我增加birthRate时,我只想要粒子从emitterPosition开始出现,而不是沿着CAEmitterCell的预计生命期。 任何帮助表示赞赏。

#import "EmitterView.h" @interface EmitterView () @property CAEmitterLayer* emitter; @end @implementation EmitterView - (void) awakeFromNib { [super awakeFromNib]; self.emitter = (CAEmitterLayer*)self.layer; CAEmitterCell* snowflake = [CAEmitterCell emitterCell]; snowflake.contents = (id)[[UIImage imageNamed: @"snowflake"] CGImage]; snowflake.lifetime = 3; snowflake.birthRate = 1; snowflake.velocity = 50; snowflake.emissionRange = 3.1415; self.emitter.birthRate = 0; self.emitter.emitterCells = [NSArray arrayWithObject: snowflake]; self.emitter.emitterPosition = CGPointMake(100, 100); self.emitter.emitterSize = CGSizeMake(0, 0); self.emitter.emitterShape = kCAEmitterLayerPoint; } + (Class) layerClass { return [CAEmitterLayer class]; } - (void) burst { self.emitter.birthRate = 10; dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 0.1 * NSEC_PER_SEC), dispatch_get_main_queue(), ^{ self.emitter.birthRate = 0; }); } @end 

这个行为实际上是随着iOS 7的发布而改变的,从那以后显然还没有回来。 它曾经是在iOS 7之前的行为,但是苹果公​​司引入了一个导致这个问题的bug,或者他们select改变行为而不告诉任何人。

我在2013年8月28日为这个确切的问题提出了一个错误,这个错误被closures了,作为同一个问题的另一个错误报告的重复。 苹果公司的臭虫记者报道说,另一个bug仍然是开放的,这意味着苹果公司还没有解决这个问题,尽pipe一年半以后才能处理。

我build议向苹果公司提交自己的错误报告,给他们一个简单的应用程序,以显示行为,也许重新获得关注,将有助于他们做一些事情。

编辑:

稍微研究一下这个问题之后,我发现解决办法就是加上这一行:

 self.emitter.beginTime = CACurrentMediaTime(); 

了解CAEmitterLayerCALayer一个子类,符合CAMediaTiming协议,这一点很重要。 为什么整个事实没有更好的logging是超越了我。

请注意,您可能想要从- (void)burst方法中调用此方法,但是如果在短时间内再次调用此方法,而以前的粒子仍在其中,则可能会看到一些奇怪的行为,因为重置了beginTime