2012-08-12 18 views
6

Tengo una aplicación de dibujo y me gustaría que mis usuarios puedan usar efectos de partículas como parte de su dibujo. Básicamente, el objetivo de la aplicación es realizar dibujos personalizados y guardarlos en Camera Roll o compartirlos a través de la World Wide Web.CAEmitterLayer no representa cuando -renderInContext: de superlayer se llama

Hace poco codifiqué la clase CAEmitterLayer, que creo que sería una forma simple y efectiva de agregar efectos de partículas.

He podido dibujar las partículas en pantalla en la aplicación usando la implementación CAEmitterLayer. Así que renderizar en pantalla funciona bien.

Cuando hago para representar el contenido del dibujo utilizando

CGContextRef context = UIGraphicsBeginImageContextWithSize(self.bounds.size); 

// The instance drawingView has a CAEmitterLayer instance in its layer/view hierarchy 
[drawingView.layer renderInContext:context]; 


//Note: I have also tried using the layer.presentationLayer and still nada 

.... 
//Get the image from the current image context here for saving to Camera Roll or sharing 


....the particles are never rendered in the image. 

Lo que creo que está pasando

El CAEmitterLayer está en un constante estado de "animación" las partículas. Es por eso que cuando intento renderizar la capa (también intenté renderizar layers.presentationLayer y modelLayer), las animaciones nunca se confirman y, por lo tanto, la representación de la imagen fuera de pantalla no contiene las partículas.

Pregunta ¿Alguien ha rendido el contenido de un CAEmitterLayer fuera de la pantalla? Si es así, ¿cómo lo hiciste?

Pregunta alternativa ¿Alguien sabe de alguna biblioteca de sistema de efectos de partículas que no utiliza OpenGL y no es Cocos2D?

+0

¿Alguna suerte con esto? –

+0

No, vea la respuesta Revis a continuación. CAEmitterLayer no puede invocar a renderInContext: – micksabox

Respuesta

4

-[CALayer renderInContext:] es útil en algunos casos simples, pero no funcionará como se esperaba en situaciones más complicadas. Necesitarás encontrar otra forma de hacer tu dibujo.

The documentation for -[CALayer renderInContext:] dice:

El Mac OS X v10.5 aplicación de este método no el apoyo de toda la composición modelo Core Animation. Las capas QCCompositionLayer, CAOpenGLLayer y QTMovieLayer no están renderizadas. Además, las capas que usan transformaciones 3D no se procesan en , ni las capas que especifican filtros de fondo, filtros, composición de filtro o valores de máscara. Las versiones futuras de Mac OS X pueden agregar soporte para representar estas capas y propiedades.

(Estas limitaciones se aplican a iOS, también.)

La cabecera CALayer.h también dice:

* WARNING: currently this method does not implement the full 
* CoreAnimation composition model, use with caution. */ 
+0

¡Bien indicado! Otras personas quieren hacer esto, hay alguna forma no documentada de capturar los píxeles, pero por supuesto nunca podrías usarlo en una aplicación enviada. Me pregunto si de alguna manera podría agregar una capa similar a un contexto de mapa de bits, y luego tomar eso? No sería lo que el usuario vio, pero ¿tal vez podría obtener algo similar? –

+0

¿Conoces alguna forma no documentada de hacer esto? – Chris

0

pude conseguir mi CAEmitterLayer mostrado como una imagen correctamente en su estado actual de la animación con

Swift 

func drawViewHierarchyInRect(_ rect: CGRect, 
      afterScreenUpdates afterUpdates: Bool) -> Bool 



Objective-C 

- (BOOL)drawViewHierarchyInRect:(CGRect)rect 
      afterScreenUpdates:(BOOL)afterUpdates 

dentro de un contexto actual

UIGraphicsBeginImageContextWithOptions(size, false, 0) 

y establecer afterScreenUpdates en true | YES

Buena suerte con eso: D

+1

Podemos usar esto, pero CAEmitterLayer será lento a partir de la segunda captura de pantalla. – Uttam

Cuestiones relacionadas