ios objective-c core-animation ios7 caemitterlayer

iOS 7 CAEmitterLayer generando partículas de forma inapropiada



objective-c core-animation (2)

Extraño problema Parece que no puedo resolver dónde solo en iOS 7 , CAEmitterLayer generará partículas en la pantalla incorrectamente cuando la tasa de natalidad se establece inicialmente en un valor distinto de cero. Es como si calculase el estado de la capa en el futuro.

// 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];

Vi en la publicación de DevForums donde algunas personas mencionaron que tenían problemas similares con iOS 7 y CAEmitterLayer , pero nadie tenía ideas de cómo solucionarlo. Ahora que iOS 7 ya no es beta, pensé que debería preguntar aquí y ver si alguien puede descifrarlo. Realmente espero que esto no sea solo un error que tenemos que esperar a que se 7.0.1 o 7.1 . Cualquier idea será altamente apreciada. ¡Gracias!


¡SÍ!

Pasé horas en este problema yo mismo.

Para obtener el mismo tipo de animación del birthRate que teníamos antes de usar un par de estrategias.

En primer lugar, si desea que la capa parezca que comienza a emitirse cuando se agrega a la vista, debe recordar que CAEmitterLayer es una subclase de CALayer que se ajusta al protocolo CAMediaTiming . Tenemos que configurar toda la capa de emisor para comenzar en el momento actual:

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

Es como si calculase el estado de la capa en el futuro.

Estuviste inquietantemente cerca, pero en realidad es que el emisor estaba comenzando en el pasado.

En segundo lugar, para animar entre una tasa de nacimiento de 0 y n, con el efecto que teníamos antes, podemos manipular la propiedad de por vida en su lugar:

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

Tenga en cuenta que configuro la lifetime en la capa del emisor. Esto se debe a que al emitir la versión de la celda emisora ​​de esta propiedad se multiplica por el valor en la capa del emisor. La configuración de la lifetime de la capa de emisor establece un múltiplo de la lifetime de todas las celdas de su emisor, lo que le permite encender y apagar todo con facilidad.


Para mí, el problema con mi CAEmitterLayer, al pasar a iOS7 fue el siguiente:

En la configuración de iOS7, la duración de CAEmitterLayerCell dio como resultado que la partícula no se muestre en absoluto.

Lo único que tuve que cambiar fue eliminar cell.duration = XXX y luego mis partículas comenzaron a aparecer nuevamente. Voy a comer una manzana por esta inesperada e inexplicable molestia.