2012-08-12 17 views
6

Mam aplikację do rysowania i chciałbym, aby moi użytkownicy mogli używać efektów cząsteczkowych jako części ich rysunku. Zasadniczo, celem aplikacji jest wykonanie niestandardowego rysunku i zapisanie w aplikacji Camera Roll lub udostępnienie w sieci WWW.CAEmitterLayer nie renderuje, gdy -renderInContext: z superlayer nazywa się

Ostatnio spotkałem klasę CAEmitterLayer, która według mnie byłaby prostym i skutecznym sposobem dodawania efektów cząsteczkowych.

Byłem w stanie narysować cząstki na ekranie w aplikacji przy użyciu implementacji CAEmitterLayer. Więc renderowanie na ekranie działa dobrze.

Kiedy idę o renderowania zawartości rysunku za pomocą

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. 

Co myślę dzieje

CAEmitterLayer jest w stanie ciągłego „animowanie” cząstek. Dlatego gdy próbuję renderować warstwę (próbowałem również renderować layers.presentationLayer i modelLayer), animacje nigdy nie są zatwierdzane, a więc renderowanie poza ekranem nie zawiera cząstek.

Pytanie Czy ktoś wyrenderował zawartość poza ekranem CAEmitterLayer? Jeśli tak, jak to zrobiłeś?

Alternatywne pytanie Czy ktoś wie o jakichkolwiek bibliotekach efektów cząsteczkowych, które nie korzystają z OpenGL i nie jest Cocos2D?

+0

Czy to szczęście? –

+0

Nie, patrz odpowiedź Revis poniżej. CAEmitterLayer nie może wywołać renderInContext: – micksabox

Odpowiedz

4

-[CALayer renderInContext:] jest przydatna w kilku prostych przypadkach, ale nie będzie działać zgodnie z oczekiwaniami w bardziej skomplikowanych sytuacjach. Musisz znaleźć inny sposób wykonania rysunku.

The documentation for -[CALayer renderInContext:] mówi:

Mac OS X v10.5 implementacja tej metody nie wsparcie cała kompozycja modelu Core Animation. Warstwy QCCompositionLayer, CAOpenGLLayer i QTMovieLayer nie są renderowane . Ponadto warstwy korzystające z transformacji 3D nie są renderowane, a warstwy nie określają filtrów tła, filtrów, wartości filtru ani wartości maski. Przyszłe wersje systemu Mac OS X mogą dodać obsługę renderowania tych warstw i właściwości.

(Te ograniczenia dotyczą również iOS.)

Nagłówek CALayer.h mówi:

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

Ładnie podane! Inni ludzie chcą to zrobić, istnieje pewien nieudokumentowany sposób na pobranie pikseli, ale oczywiście nigdy nie można go użyć w przesłanej aplikacji. Zastanawiam się, czy mógłbyś w jakiś sposób dodać podobną warstwę do kontekstu bitmapowego, a następnie ją pobrać? To nie jest to, co widział użytkownik, ale może uda się uzyskać coś podobnego? –

+0

Czy znasz jakiś nieudokumentowany sposób na zrobienie tego? – Chris

0

udało mi się dostać mój CAEmitterLayer renderowane jako obraz poprawnie w jego obecnym stanie animacji z

Swift 

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



Objective-C 

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

w obecnym kontekście

UIGraphicsBeginImageContextWithOptions(size, false, 0) 

i ustawić afterScreenUpdates na true | YES

Powodzenia z tym: D

+1

Możemy tego użyć, ale CAEmitterLayer stanie się wolniejszy od drugiego zrzutu ekranu. – Uttam

Powiązane problemy