21

奇怪的问题我似乎无法解决仅在哪里,当出生率最初设置为非零值时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 上看到一篇帖子,其中有几个人提到他们在使用 and 时遇到了类似的问题iOS 7CAEmitterLayer但没有人知道如何解决它。现在它iOS 7不再是测试版,我想我应该在这里问一下,看看是否有人可以破解它。我真的希望这不仅仅是一个我们必须等待7.0.17.1修复的错误。任何想法将不胜感激。谢谢!

4

2 回答 2

40

是的!

我自己花了几个小时来解决这个问题。

为了获得与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发射器层的 s 设置所有发射器单元的 s 的倍数lifetime,使您可以轻松地打开和关闭它们。

于 2013-09-21T13:35:14.777 回答
2

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

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

我唯一需要改变的是删除 cell.duration = XXX 然后我的粒子又开始出现了。我要为这个意想不到的、无法解释的麻烦吃一个苹果。

于 2013-09-24T23:40:10.603 回答