6

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

我最近遇到了这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模型图层),动画永远不会提交,因此屏幕外图像渲染不包含粒子。

问题 有没有人渲染过CAEmitterLayer屏幕外的内容?如果是这样,你是怎么做到的?

替代问题 有谁知道任何不使用 OpenGL 且不是 Cocos2D 的粒子效果系统库?

4

2 回答 2

4

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

的文档-[CALayer renderInContext:]说:

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

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

标题CALayer.h还说:

 * WARNING: currently this method does not implement the full
 * CoreAnimation composition model, use with caution. */
于 2012-08-12T23:52:59.500 回答
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

于 2016-08-10T19:08:02.617 回答