我正在使用其委托(delegate)方法drawLayer:inContext:在CALayer上绘制图形。

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

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

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

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

如何使用高分辨率的CGLayer来支持Retina Display?

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

我通过CGLayerCreateWithContex通过从CALayer传递的图形上下文获得CGLayer,并使用CG函数(例如CGContextFillPathCGContextAddLineToPoint)利用其上下文。

我需要同时支持iOS 4.x和iOS 3.1.3,以及Retina和传统显示器。

谢谢,

最佳答案

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

  • 首次创建图层时,需要通过将尺寸乘以比例来计算正确的边界:
    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);
    
  • 然后,您需要为图层上下文设置正确的比例:
    CGContextScaleCTM(layerContext, scale, scale);
    
  • 如果当前设备具有视网膜显示,则现在绘制到该图层的所有图形都将被放大两倍。
  • 当您最终绘制图层内容时,请确保使用CGContextDrawLayerInRect并提供未缩放的CGRect:
    CGRect bounds = CGRectMake(0, 0, width, height);
    CGContextDrawLayerInRect(context, bounds, layerContext);
    

  • 而已!

    关于ios - iOS:我如何通过CGLayer支持Retina Display?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6729899/

    10-08 23:36