奇怪的问题我似乎无法解决仅在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 7
和CAEmitterLayer
方面遇到了类似的问题,但没有人有任何想法如何修复它。现在iOS 7
不再是测试版了,我想我应该在这里询问是否有人可以破解它。我真的希望这不仅仅是一个我们必须等待7.0.1
或7.1
修复的错误。任何想法将不胜感激。谢谢!
答案 0 :(得分:34)
YES!
我自己花了几个小时研究这个问题。
在我们使用一些策略之前,要获得我们所拥有的birthRate
相同类型的动画。
首先,如果您希望图层在添加到视图时看起来像是开始发光,则需要记住CAEmitterLayer
是CALayer
的子类,它符合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然后我的粒子再次出现。我将在这种意想不到的,无法解释的麻烦中吃掉苹果。