iOS:如何使用CGLayer支持Retina Display?

时间:2011-07-18 07:39:08

标签: ios retina-display cglayer

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

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

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

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

但是对于我使用CGLayer的部分仍然模糊不清。

如何以高分辨率绘制CGLayer以支持Retina Display?

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

我通过CGLayerCreateWithContex获取CGLayer,其中包含从CALayer传递的图形上下文,并使用CG函数(例如CGContextFillPathCGContextAddLineToPoint)绘制其上下文。

我需要支持iOS 4.x和iOS 3.1.3,包括Retina和传统显示器。

谢谢,

库拉

2 个答案:

答案 0 :(得分: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. 如果当前设备有视网膜显示屏,那么对图层所做的所有绘图现在都会被绘制两倍。

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

    CGRect bounds = CGRectMake(0, 0, width, height);
    CGContextDrawLayerInRect(context, bounds, layerContext);
    
  5. 就是这样!

答案 1 :(得分:1)

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

我发现了类似的问题here,发现在我的案例中没有使用CGLayer的意义。

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

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