Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/95.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
iOS:如何使用CGLayer支持视网膜显示?_Ios_Retina Display_Cglayer - Fatal编程技术网

iOS:如何使用CGLayer支持视网膜显示?

iOS:如何使用CGLayer支持视网膜显示?,ios,retina-display,cglayer,Ios,Retina Display,Cglayer,我正在CALayer的委托方法drawLayer:inContext:中绘制一个图形 现在我想支持视网膜显示,因为在最新的设备上,图形看起来很模糊 对于我直接在CALayer传递的图形上下文上绘制的部分,我可以通过如下设置CALayer的contentScale属性很好地以高分辨率绘制 if ([myLayer respondsToSelector:@selector(setContentsScale:)]) { myLayer.contentsScale = [[UIScreen ma

我正在CALayer的委托方法
drawLayer:inContext:
中绘制一个图形

现在我想支持视网膜显示,因为在最新的设备上,图形看起来很模糊

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

if ([myLayer respondsToSelector:@selector(setContentsScale:)]) {
    myLayer.contentsScale = [[UIScreen mainScreen] scale];
}
但对于我使用CGLayer的部分,仍然绘制模糊

如何在高分辨率的CGLayer上绘制以支持视网膜显示

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

我通过
CGLayerCreateWithContex
获得CGLayer,并使用CG函数(如
CGContextFillPath
CGContextAddLineToPoint
)绘制其上下文

我需要同时支持iOS 4.x和iOS 3.1.3,包括视网膜和传统显示器

谢谢


Kura

我决定不使用CGLayer,而是直接在CALayer的图形环境中绘制,现在它在视网膜显示器上以高分辨率绘制

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

我之所以使用CGLayer,是因为《石英2D编程指南》中有苹果的示例程序。在本例中,它为一颗星创建一个CGLayer,并多次使用它绘制50颗星。我认为这是出于性能原因,但我没有看到任何性能差异


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

这是如何正确绘制所有分辨率的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);
    
  • 如果当前设备具有视网膜显示器,则该层的所有绘图现在将绘制两倍大

  • 最后绘制图层内容时,请确保使用CGContextDrawLayerRect并提供未缩放的CGRect:

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

  • 就这样

    看起来这篇文章可能很有意义:邓肯,谢谢你的评论,但是没有。。。我以前读过这篇文章,但这篇文章讨论的是直接在UIView的上下文中绘图。CALayer与UIView具有相同的属性
    scale
    ,其工作原理与我前面所述的相同。我的问题是在CGLayer上绘图。CGLayer没有
    scale
    属性:(这不是问题的真正解决方案。这是一个有趣的问题,我希望有答案。除了与苹果文档相矛盾的建议外,该链接也没有提出其他解决方案。关于性能:在我的应用程序中,我使用的是
    UIImage
    方法
    drawInRect:
    。在我遇到的一个场景中使用
    CGLayer
    进行测量大约比直接使用
    CALayer
    上下文绘制快20倍(约50毫秒vs.1秒)。因此我猜这可能取决于
    CGLayer
    中存储的绘制操作类型是否存在性能差异。谢谢!我下次会试试。;)谢谢,这正是它应该做的。这显著提高了清晰度,但与直接使用上下文绘制(不使用
    CGlayer
    )相比,它看起来仍然稍微不那么清晰。这正常吗?我还试着将刻度设置为4或8。