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

我在它的委托方法drawLayer:inContext:绘制一个CALayer图。

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

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

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

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

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

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

我通过CGLayerCreateWithContex从CALayer传递的graphics上下文获取CGLayer,并使用CG函数(如CGContextFillPathCGContextAddLineToPoint绘制其上下文。

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

谢谢,

库拉

这是如何正确绘制一个CGLayer的所有决议。

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

     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); 

而已!

我决定不使用CGLayer,直接绘制CALayer的graphics上下文,现在在高分辨率的视网膜显示器上绘制好了。

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

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

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