【问题标题】:draw CALayer into a CGContext将 CALayer 绘制到 CGContext 中
【发布时间】:2011-05-26 04:00:00
【问题描述】:

我有以下代码:

CGContextRef context = UIGraphicsGetCurrentContext();

CGContextSaveGState(context);

CALayer *sublayer = [CALayer layer];
sublayer.backgroundColor = [UIColor orangeColor].CGColor;
sublayer.cornerRadius = 20.0;
sublayer.frame = CGRectMake(20, 0, 300, 20);

[sublayer setNeedsDisplay];
[sublayer drawInContext:context];

UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();

UIGraphicsEndImageContext();

return newImage;

但是当我查看返回的 newImage 时,只有一个空图像。当我将drawInContext更改为renderInContext时,我得到了上面的子层,但似乎坐标系混乱了。

知道为什么上面的 drawInContext 不起作用吗?

【问题讨论】:

    标签: calayer cgcontext


    【解决方案1】:

    尝试使用renderInContext 代替drawInContext

    我的理解是drawInContext 会被覆盖,而renderInContext 用于将图层的内容渲染到上下文中。

    来自the documentation

    - drawInContext:

    此方法的默认实现本身不进行任何绘图。如果图层的委托实现了drawLayer:inContext: 方法,则调用该方法进行实际绘制。

    子类可以覆盖此方法并使用它来绘制图层的内容。绘制时,所有坐标都应以逻辑坐标空间中的点为单位指定。


    - renderInContext:

    此方法直接从层树渲染,忽略添加到渲染树的任何动画。在图层的坐标空间中渲染。

    【讨论】:

    • 你太棒了。
    【解决方案2】:

    坐标系本身并没有混乱。 Quartz 使用与 UIKit 不同的坐标系。在 Quartz 中,Y 轴起源于框架矩形的左下角。当您在矩形“向上”走得更远时,这些值会变得更大。有关可视化表示,请参阅

    处的文档

    http://developer.apple.com/library/mac/#documentation/graphicsimaging/Conceptual/drawingwithquartz2d/dq_overview/dq_overview.html

    这与 UIKit 的不同之处在于 UIKit 的坐标系原点位于左上角,当您“向下”移动时,y 轴值变得更正。

    至于为什么 drawInContext: 不起作用,您还应该参考 CALayer 类的文档,其中说:“默认实现什么都不做。”

    http://developer.apple.com/library/mac/#documentation/GraphicsImaging/Reference/CALayer_class/Introduction/Introduction.html

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多