【问题标题】:CAShaperLayer -renderInContext Doesn't Work?CAShaperLayer -renderInContext 不起作用?
【发布时间】:2009-08-15 22:02:14
【问题描述】:

我可以使用以下代码从核心动画层创建 UIImage:

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

   return image;
}

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

渲染接收器及其子层 进入指定的上下文。

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

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

谢谢。

【问题讨论】:

    标签: iphone core-animation uiimage calayer cashapelayer


    【解决方案1】:

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

    整体的形状是合成的 图层内容与其 第一个子层。

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

    【讨论】:

    • 有趣。想知道苹果会在我提交的雷达上返回什么——如果这是预期的行为。我不确定它在内容和第一个子层之间的合成意味着什么。如何?我想这可以解释它。如果我没看错的话,它似乎不是内容的一部分。
    【解决方案2】:

    不知道它是否与您相关,但 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 代替?您需要覆盖该方法,因为默认情况下它不执行任何操作。您的子类还需要将上下文移动到相应的框架中。另外为了安全起见,您可能需要检查您添加的任何代码都不会影响这些图层的正常渲染。

    【讨论】:

    • 这很奇怪,因为我没有使用该通知中指定的任何字段。问题是我想将图层渲染为图像,然后重新使用图像,因为与使用图像相比,仅将图层添加到图层树会导致性能明显下降。我在表格单元格中使用它,所以我需要提高它的效率,但我想动态绘制图像,因为每次我们需要新皮肤时让图形艺术家创建一个新图像是不可取的。我想还有其他非 CA 方法可以做到这一点。感谢您的反馈。
    【解决方案3】:

    我为此提交了一份雷达报告。我在文档中看不出它不应该起作用的任何原因。如果/当 Apple 回复雷达时,我会在这里回复。

    【讨论】:

    • 我发现除了形状本身之外没有任何实际渲染。我认为这就是它的设计方式,但是文档很薄弱。在旁注中,您可能会觉得这很有趣:tumbljack.com/post/179975074/…
    • 你收到过 Apple 的回复吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-25
    相关资源
    最近更新 更多