2012-08-12 13 views
6

Ho un'app di disegno e vorrei che i miei utenti potessero utilizzare gli effetti particellari come parte del disegno. Fondamentalmente, il punto dell'app è eseguire il disegno personalizzato e salvarlo nel rullino fotografico o condividere sul World Wide Web.CAEmitterLayer non esegue il rendering quando -renderInContext: di superlayer si chiama

Ho rilevato la classe CAEmitterLayer di recente, che ritengo sarebbe un modo semplice ed efficace per aggiungere effetti particellari.

Sono stato in grado di disegnare le particelle sullo schermo nell'app utilizzando l'implementazione CAEmitterLayer. Quindi il rendering sullo schermo funziona bene.

Quando vado circa rendere il contenuto del disegno utilizzando

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. 

Quello che penso sta accadendo

Il CAEmitterLayer è in un costante stato di "animare" le particelle. Ecco perché quando provo a renderizzare il livello (ho anche provato a eseguire il rendering di layers.presentationLayer e modelLayer), le animazioni non vengono mai salvate e quindi il rendering dell'immagine fuori schermo non contiene le particelle.

Domanda Qualcuno ha reso il contenuto di uno schermo esterno CAEmitterLayer? Se è così, come avete fatto?

Domanda alternata Qualcuno sa di librerie di sistema con effetti particellari che non usano OpenGL e non sono Cocos2D?

+0

Hai avuto fortuna? –

+0

No, vedere la risposta di Revis in basso. CAEmitterLayer non può chiamare renderInContext: – micksabox

risposta

4

-[CALayer renderInContext:] è utile in alcuni casi semplici, ma non funzionerà come previsto in situazioni più complesse. Dovrai trovare un altro modo per fare il tuo disegno.

The documentation for -[CALayer renderInContext:] dice:

Il Mac OS X v10.5 applicazione di questo metodo non lo fa sostegno l'intera composizione del modello Core Animation. I layer QCCompositionLayer, CAOpenGLLayer e QTMovieLayer non sono resi . Inoltre, i livelli che utilizzano trasformazioni 3D non sono resi , né i layer che specificano backgroundFilters, i filtri, compositingFilter o i valori di una maschera. Le versioni future di Mac OS X possono aggiungere il supporto per il rendering di questi livelli e proprietà.

(Queste limitazioni si applicano anche a iOS.)

L'intestazione CALayer.h dice anche:

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

Ben detto! Altre persone vogliono farlo, c'è un modo non documentato per catturare i pixel ma ovviamente non potresti mai usarlo in un'app inviata. Mi chiedo se potresti in qualche modo aggiungere un livello simile a un contesto bitmap, e poi afferrarlo? Non sarebbe quello che l'utente ha visto, ma forse potresti ottenere qualcosa di simile? –

+0

Conosci qualche modo non documentato per farlo? – Chris

0

ero in grado di ottenere il mio CAEmitterLayer reso come immagine correttamente nel suo stato di animazione corrente con

Swift 

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



Objective-C 

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

all'interno di un contesto attuale

UIGraphicsBeginImageContextWithOptions(size, false, 0) 

e impostare dopoScreenUpdates su true | YES

Buona fortuna con quello: D

+1

Possiamo usarlo ma CAEmitterLayer diventerà lento dal secondo screenshot. – Uttam

Problemi correlati