CAEmitterLayer не рендерится, когда вызывается -renderInContext: of superlayer

У меня есть приложение для рисования, и я бы хотел, чтобы мои пользователи могли использовать эффекты частиц как часть своего рисунка. По сути, целью приложения является выполнение пользовательского рисования и сохранение в Camera Roll или обмен по Интернету.

Я вложил CAEmitterLayer Класс, который, как я считаю, был бы простым и эффективным способом добавления эффектов частиц.

Я смог нарисовать частицы на экране в приложении, используя CAEmitterLayer реализация. Так что рендеринг на экране работает нормально.

Когда я иду о рендеринге содержимого рисунка с помощью

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.

Что я думаю, что происходит

CAEmitterLayer находится в постоянном состоянии "оживления" частиц. Вот почему, когда я пытаюсь визуализировать слой (я также пытался сделать layers.presentationLayer и modelLayer), анимации никогда не фиксируются, и поэтому рендеринг изображения вне экрана не содержит частиц.

Вопрос: Кто-нибудь предоставил содержимое CAEmitterLayer закадровый? Если да, то как ты это сделал?

Альтернативный вопрос Кто-нибудь знает о каких-либо системных библиотеках эффектов частиц, которые не используют OpenGL и не являются Cocos2D?

2 ответа

Решение

-[CALayer renderInContext:] полезен в нескольких простых случаях, но не будет работать должным образом в более сложных ситуациях. Вам нужно будет найти другой способ сделать свой рисунок.

Документация для-[CALayer renderInContext:] говорит:

Реализация этого метода в Mac OS X v10.5 не поддерживает всю композиционную модель Core Animation. Слои QCCompositionLayer, CAOpenGLLayer и QTMovieLayer не отображаются. Кроме того, слои, использующие трехмерные преобразования, не отображаются, равно как и слои, которые задают backgroundFilters, фильтры, compositingFilter или значения маски. В будущих версиях Mac OS X может быть добавлена ​​поддержка рендеринга этих слоев и свойств.

(Эти ограничения распространяются и на iOS.)

Заголовок CALayer.h также говорит:

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

Мне удалось правильно отобразить мой CAEmitterLayer как изображение в его текущем состоянии анимации с

Swift

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



Objective-C

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

в текущем контексте

UIGraphicsBeginImageContextWithOptions(size, false, 0)

и установите afterScreenUpdates в true|YES

Удачи с этим:D

Другие вопросы по тегам