CAShaperLayer -renderInContext不起作用?

时间:2009-08-15 22:02:15

标签: iphone core-animation uiimage calayer cashapelayer

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

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

   return image;
}

此代码位于我的CALayer派生类中。我遇到的问题是我有两个CAShapeLayers,它们是我的图层的子图层,无法渲染到生成的图像。如果我添加标准CALayers作为孩子,他们会得到很好的渲染。 Apple文档说:

  

渲染接收器及其子层   进入指定的背景。

它还表示自iPhone OS 2.0以来它已经可用。想知道是否有我遗失的东西,或者我是否应该提交雷达。

任何想法可能会让孩子CAShapeLayers无法被吸引到图像中?

感谢。

3 个答案:

答案 0 :(得分:4)

CALayer机器调用renderInContext来创建其位图内容属性。但是在CAShapeLayer中,path属性实际上并没有呈现给它的内容,如标题中的这个注释所示:

  

整个形状是合成的   层的内容和它的内容   第一个子层。

理所当然,renderInContext实际上不会将CAShapeLayer路径渲染到您的上下文中。然而,我并没有真正尝试过这个。

答案 1 :(得分:0)

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

**Important**: The Mac OS X v10.5 implementation of this method does not
support the entire Core Animation composition model. QCCompositionLayer, 
CAOpenGLLayer, and QTMovieLayer layers are not rendered. Additionally,
layers that use 3D transforms are not rendered, nor are layers that specify 
backgroundFilters, filters, compositingFilter, or a mask values. 
Future versions of Mac OS X may add support for rendering these layers
and properties.

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

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

答案 2 :(得分:0)

我对此提出了一个雷达。我无法在文档中看到它不应该工作的任何原因。如果/当Apple回复雷达时,我会回复此处。