我的目标是制作类似爆炸的动画,其中很多粒子会在短时间内发出。我的问题是CAEmitterLayer在开始发射时会添加“未来”粒子,使其看起来像动画已经运行了一段时间。
如何禁用或解决此问题?当我增加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
答案 0 :(得分:25)
这种行为实际上随着iOS 7的发布而改变,并且从那以后显然没有回归。过去它的行为方式与iOS 7之前的预期相同,但苹果公司引入了导致此问题的错误,或者他们选择改变行为而不告诉任何人。
我在2013年8月28日提交了一个针对此问题的错误,该错误已作为同一问题的另一个错误报告的副本而关闭。 Apple的bug记者报道说,另一个bug仍然是开放的,这意味着苹果还没有解决它,尽管超过一年半的时间来处理它。
我建议您向Apple提交自己的错误报告,为他们提供一个简单的应用程序来演示行为,并且可能会重新关注它将有助于他们对此做些什么。
编辑:
在仔细研究了这个问题之后,我发现解决方案是添加这一行:
self.emitter.beginTime = CACurrentMediaTime();
重要的是要知道CAEmitterLayer
是CALayer
的子类,它符合CAMediaTiming
协议。为什么这整个事实没有更好的记录是超出我的。
请注意,您可能希望通过- (void)burst
方法调用此方法,但是如果您在短时间内再次调用它,而之前的粒子仍然存在,您可能会看到一些奇怪的行为,因为重置beginTime
。