3

我可以使用以下代码从 Core Animation 层创建 UIImage:

- (UIImage*)contentsImage;
{
   UIGraphicsBeginImageContext([self bounds].size);
   [self renderInContext:UIGraphicsGetCurrentContext()];
   UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
   UIGraphicsEndImageContext();

   return image;
}

此代码在我的 CALayer 派生类中。我遇到的问题是我有两个 CAShapeLayers,它们是我的图层的子图层,它们不会渲染到结果图像。如果我将标准 CALayers 添加为子项,它们会得到很好的渲染。苹果文档说:

将接收器及其子层渲染到指定的上下文中。

它还说它从 iPhone OS 2.0 开始就可用。想知道我是否遗漏了什么,或者我是否应该提交雷达。

有什么想法可以阻止孩子 CAShapeLayers 被图像吸引吗?

谢谢。

4

3 回答 3

4

CALayer 机器调用 renderInContext 来创建它的位图内容属性。但在 CAShapeLayer 中,路径属性实际上并未呈现为其内容,如标题中的此注释所示:

作为一个整体的形状是在层的内容和它的第一个子层之间合成的。

按理说 renderInContext 实际上不会将 CAShapeLayer 路径渲染到您的上下文中。但是,我实际上并没有亲自尝试过。

于 2009-09-02T04:37:38.947 回答
0

我对此提出了雷达。我在文档中看不到它不应该工作的任何理由。如果/当 Apple 回复雷达时,我会在这里回复。

于 2009-08-29T03:08:04.537 回答
0

不知道它是否与您相关,但在 CALayer 文档中有一条关于 renderInContext 的说明:

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

无论如何,在将 UIView drawRect 函数与图像上下文中的绘图结合使用时,我遇到了类似的问题。如果我调用 drawRect,包含子视图的整个 UIView 将不会绘制其子视图(这实际上是有道理的,因为它在文档中说,如果你调用 drawRect,你负责填充整个区域,而不管超级视图和子视图的实现如何)。我通过在所有子视图上调用 drawRect 解决了我的问题,并将它们自己的帧传递给它们。

所以我建议也许从 renderInContext 切换并使用 CALayer 的 drawInContext 代替?您需要覆盖该方法,因为默认情况下它不执行任何操作。您的子类还需要将上下文移动到相应的框架中。另外为了安全起见,您可能需要检查您添加的任何代码都不会影响这些图层的正常渲染。

于 2009-08-17T02:40:47.400 回答