iOS:如何使用CGLayer支持视网膜显示?
我正在CALayer的委托方法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
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);
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。