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