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

Tak*_*aka 19 cglayer ios retina-display

我在其委托方法中在CALayer上绘制图形drawLayer:inContext:.

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

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

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

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

如何在高分辨率的CGLayer上绘制以支持Retina显示?

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

我得到CGLayer通过CGLayerCreateWithContex从CALayer的通过图形上下文,并借鉴使用CG功能,如它的上下文CGContextFillPathCGContextAddLineToPoint.

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

谢谢,

库拉

Joh*_*nes 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);
    
    Run Code Online (Sandbox Code Playgroud)
  2. 然后,您需要为图层上下文设置正确的比例:

    CGContextScaleCTM(layerContext, scale, scale);
    
    Run Code Online (Sandbox Code Playgroud)
  3. 如果当前设备具有视网膜显示器,则对该层进行的所有绘制现在将被绘制两倍大.

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

    CGRect bounds = CGRectMake(0, 0, width, height);
    CGContextDrawLayerInRect(context, bounds, layerContext);
    
    Run Code Online (Sandbox Code Playgroud)

而已!