当调用superlayer的-renderInContext:时,CAEmitterLayer不呈现

时间:2012-08-12 23:36:14

标签: ios core-animation calayer caemitterlayer

我有一个绘图应用程序,我希望我的用户能够使用粒子效果作为绘图的一部分。基本上,应用程序的重点是执行自定义绘图并保存到相机胶卷或通过万维网共享。

我最近对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 个答案:

答案 0 :(得分:4)

-[CALayer renderInContext:]在一些简单的情况下很有用,但在更复杂的情况下无法正常工作。您需要找到其他方法来进行绘图。

The documentation for -[CALayer renderInContext:]说:

  

此方法的Mac OS X v10.5实现没有   支持整个Core Animation组合模型。   QCCompositionLayer,CAOpenGLLayer和QTMovieLayer图层不是   渲染。此外,使用3D变换的图层不是   渲染,也不是指定backgroundFilters,过滤器的图层,   compositingFilter,或掩码值。未来版本的Mac OS X可能会   添加对渲染这些图层和属性的支持。

(这些限制也适用于iOS。)

标题CALayer.h也说:

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

答案 1 :(得分:0)

我能够使用

将我的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