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

前端之家收集整理的这篇文章主要介绍了ios – 来自CAEmitterLayer的初始粒子不会从emitterPosition开始前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我的目标是制作类似爆炸的动画,其中许多粒子在短时间内发射.我的问题是CAEmitterLayer在开始发射时会添加“未来”粒子,使其看起来像动画已经运行了一段时间.

如何禁用或解决此问题?当我增加birthRate时,我只希望粒子从emitterPosition开始出现,而不是沿着CAEmitterCell的预计生命周期的所有点开始.任何帮助表示赞赏.

  1. #import "EmitterView.h"
  2.  
  3. @interface EmitterView ()
  4.  
  5. @property CAEmitterLayer* emitter;
  6.  
  7. @end
  8.  
  9. @implementation EmitterView
  10.  
  11. - (void) awakeFromNib {
  12. [super awakeFromNib];
  13. self.emitter = (CAEmitterLayer*)self.layer;
  14.  
  15. CAEmitterCell* snowflake = [CAEmitterCell emitterCell];
  16. snowflake.contents = (id)[[UIImage imageNamed: @"snowflake"] CGImage];
  17. snowflake.lifetime = 3;
  18. snowflake.birthRate = 1;
  19. snowflake.velocity = 50;
  20. snowflake.emissionRange = 3.1415;
  21.  
  22. self.emitter.birthRate = 0;
  23. self.emitter.emitterCells = [NSArray arrayWithObject: snowflake];
  24. self.emitter.emitterPosition = CGPointMake(100,100);
  25. self.emitter.emitterSize = CGSizeMake(0,0);
  26. self.emitter.emitterShape = kCAEmitterLayerPoint;
  27. }
  28.  
  29. + (Class) layerClass {
  30. return [CAEmitterLayer class];
  31. }
  32.  
  33. - (void) burst {
  34. self.emitter.birthRate = 10;
  35. dispatch_after(dispatch_time(DISPATCH_TIME_NOW,0.1 * NSEC_PER_SEC),dispatch_get_main_queue(),^{
  36. self.emitter.birthRate = 0;
  37. });
  38. }
  39.  
  40. @end

解决方法

这种行为实际上随着iOS 7的发布而改变,并且从那以后显然还没有回归.过去它的行为方式与iOS 7之前的预期相同,但苹果公司引入了导致此问题的错误,或者他们选择在不告诉任何人的情况下改变行为.

我于2013年8月28日针对此问题提交了一个错误,该错误已作为同一问题的另一个错误报告的副本而关闭.苹果公司的臭虫记者报道说,另一个漏洞仍然是开放的,这意味着苹果还没有解决它,尽管超过一年半的时间来处理它.

我建议您向Apple提交自己的错误报告,为他们提供一个简单的应用程序来演示行为,并且可能会重新关注它将有助于他们对此做些什么.

编辑:

在仔细研究了这个问题之后,我发现解决方案是添加这一行:

  1. self.emitter.beginTime = CACurrentMediaTime();

重要的是要知道CAEmitterLayer是CALayer的子类,它符合CAMediaTiming协议.为什么这整个事实没有更好的记录是超出我的.

请注意,你可能想从你的 – (void)burst方法调用它,但如果你在很短的时间内再次调用它,而之前的粒子仍然存在,你可能会看到一些奇怪的行为,因为重置了beginTime .

猜你在找的iOS相关文章