iOS 7 CAEmitterLayer不恰当地产生粒子

时间:2013-09-20 09:39:57

标签: ios objective-c core-animation ios7 caemitterlayer

奇怪的问题我似乎无法解决仅在iOS 7上的位置,CAEmitterLayer会在出生率初始设置为非零值时错误地在屏幕上产生粒子。就像它计算未来该层的状态一样。

// Create black image particle
CGRect rect = CGRectMake(0, 0, 20, 20);
UIGraphicsBeginImageContext(rect.size);
CGContextFillRect(UIGraphicsGetCurrentContext(), rect);
UIImage *img = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();

// Create cell
CAEmitterCell *cell = [CAEmitterCell emitterCell];
cell.contents = (__bridge id)img.CGImage;
cell.birthRate = 100.0;
cell.lifetime = 10.0;
cell.velocity = 100.0;

// Create emitter with particles emitting from a line on the
// bottom of the screen
CAEmitterLayer *emitter = [CAEmitterLayer layer];
emitter.emitterShape = kCAEmitterLayerLine;
emitter.emitterSize = CGSizeMake(self.view.bounds.size.width,0);
emitter.emitterPosition = CGPointMake(self.view.bounds.size.width/2,
                                      self.view.bounds.size.height);
emitter.emitterCells = @[cell];

[self.view.layer addSublayer:emitter];

我在DevForums上看到一篇文章,其中有几个人提到他们在iOS 7CAEmitterLayer方面遇到了类似的问题,但没有人有任何想法如何修复它。现在iOS 7不再是测试版了,我想我应该在这里询问是否有人可以破解它。我真的希望这不仅仅是一个我们必须等待7.0.17.1修复的错误。任何想法将不胜感激。谢谢!

2 个答案:

答案 0 :(得分:34)

YES!

我自己花了几个小时研究这个问题。

在我们使用一些策略之前,要获得我们所拥有的birthRate相同类型的动画。

首先,如果您希望图层在添加到视图时看起来像是开始发光,则需要记住CAEmitterLayerCALayer的子类,它符合CAMediaTiming协议。我们必须将整个发射器层设置为在当前时刻开始:

emitter.beginTime = CACurrentMediaTime();
[self.view.layer addSublayer:emitter];
  

就好像它计算了未来该层的状态。

你非常接近,但实际上它是发射器在过去开始的。

其次,在0和n的出生率之间进行动画制作,以及我们之前可以操作生命属性的效果:

if (shouldBeEmitting){
    emitter.lifetime = 1.0;
}
else{
    emitter.lifetime = 0;
}

请注意,我在发射器层上设置了lifetime。这是因为当发射发射器单元时,此属性的版本乘以发射器层中的值。设置发射器层的lifetime设置所有发射器单元的lifetime的倍数,允许您轻松地打开和关闭它们。

答案 1 :(得分:2)

对我来说,移动到iOS7时我的CAEmitterLayer的问题如下:

在iOS7设置中,CAEmitterLayerCell的持续时间导致粒子根本不显示!

我唯一需要改变的是删除cell.duration = XXX然后我的粒子再次出现。我将在这种意想不到的,无法解释的麻烦中吃掉苹果。