19

我正在其委托方法中的 CALayer 上绘制图表drawLayer:inContext:

现在我想支持 Retina Display,因为图表在最新设备上看起来很模糊。

对于我直接在 CALayer 传递的图形上下文上绘制的部分,我可以通过如下设置 CALayer 的 contentScale 属性很好地绘制高分辨率。

if ([myLayer respondsToSelector:@selector(setContentsScale:)]) {
    myLayer.contentsScale = [[UIScreen mainScreen] scale];
}

但是对于我使用 CGLayer 的部分,仍然画得模糊。

如何在高分辨率 CGLayer 上绘图以支持 Retina Display?

我想使用 CGLayer 重复绘制图形的相同绘图形状,以及切断超出图层边缘的图形线。

我通过从 CALayer 传递的图形上下文获取 CGLayer CGLayerCreateWithContex,并使用 CG 函数(例如CGContextFillPath或)在其上下文上绘制CGContextAddLineToPoint

我需要同时支持 iOS 4.x 和 iOS 3.1.3,包括 Retina 和旧版显示器。

谢谢,

库拉

4

2 回答 2

28

这是为所有分辨率正确绘制 CGLayer 的方法。

  1. 首次创建图层时,您需要通过将尺寸乘以比例来计算正确的边界:

    int width = 25; 
    int height = 25;
    float scale = [self contentScaleFactor];
    CGRect bounds = CGRectMake(0, 0, width * scale, height * scale);
    CGLayer layer = CGLayerCreateWithContext(context, bounds.size, NULL);
    CGContextRef layerContext = CGLayerGetContext(layer);
    
  2. 然后,您需要为图层上下文设置正确的比例:

    CGContextScaleCTM(layerContext, scale, scale);
    
  3. 如果当前设备具有 Retina 显示器,则对图层进行的所有绘制现在都将绘制两倍大。

  4. 当您最终绘制图层的内容时,请确保使用 CGContextDrawLayerInRect 并提供未缩放的 CGRect:

    CGRect bounds = CGRectMake(0, 0, width, height);
    CGContextDrawLayerInRect(context, bounds, layerContext);
    

就是这样!

于 2012-01-05T12:03:16.880 回答
1

我决定不使用 CGLayer 并直接在 CALayer 的图形上下文上绘制,现在它在视网膜显示器上以高分辨率绘制得很好。

我在这里找到了类似的问题,发现在我的情况下使用 CGLayer 没有意义。

我之所以使用 CGLayer,是因为在 Quartz 2D Programming guide 中找到了 Apple 的示例程序“Using Multiple CGLayer Objects to Draw a Flag” 。在这个例子中,它为一颗星星创建了一个 CGLayer,并多次使用它来绘制 50 颗星星。我认为这是出于性能原因,但我没有看到任何性能差异。

为了切断超出层边缘的图形线,我决定使用多个 CALayers。

于 2011-07-20T14:39:05.693 回答