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函数(如CGContextFillPath
或CGContextAddLineToPoint
绘制其上下文。
我需要同时支持iOS 4.x和iOS 3.1.3,Retina和传统显示器。
谢谢,
库拉
这是如何正确绘制一个CGLayer的所有决议。
-
首次创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);
-
然后您需要为您的图层上下文设置正确的比例:
CGContextScaleCTM(layerContext, scale, scale);
-
如果当前设备具有视网膜显示,则现在所有绘制到图层的绘图将被绘制两倍。
-
当你最终绘制图层的内容时,确保使用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。