视网膜显示屏核心图形字体质量

18

尝试理解为什么使用CGContextShowTextAtPoint绘制的图像质量较低?请参见附图: img

字母"W"是使用CGContextShowTextAtPoint在CALayer上绘制的,看起来非常像素化。旁边的按钮是标准按钮,如预期的那样高分辨率。我希望文本绘制能够高清晰度。

enter image description here

4个回答

37

默认情况下,CALayer 并不以Retina屏幕的更高分辨率呈现其Quartz 内容。您可以使用以下代码启用此功能:

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

这不仅会影响文本渲染,还会影响CALayer内的所有Quartz绘制,因此您需要为所有具有自定义Quartz内容的图层执行此操作。


1
我在CALayer上看不到contentScaleFactor属性。 - vance
1
谢谢,这是CALayer上的contentsScale: CGFloat scale = [[UIScreen mainScreen] scale]; self.contentsScale = scale; - vance
实际上,设置contentsScale会使图像看起来非常模糊。请参见附加的第二张图片。 - vance
3
@vance - 你说得对。我把那段代码从错误的位置复制了过来,参考的是UIView而不是CALayer(已经修复了)。模糊很可能是由于你的图层或绘图像素不对齐,或者是在渲染文本后应用了变换所致。请确保在图层首次显示其内容之前设置contentsScale,或者使用“-setNeedsDisplay”进行更新。请确保您的图层原点在整数像素坐标上。请记住,在使用Quartz绘制图层内部时,您需要对齐到半像素坐标而不是整数像素坐标。 - Brad Larson
九年后加入——对我来说,解决方案有两个:1)像这个答案中那样调整比例因子。 2)设置myTextLayer.shouldRasterize = false - Matt H.

6

您是否使用CGContextScaleCTM?当使用图形上下文时,可以尝试以下方法:

CGFloat scale = [[UIScreen mainScreen] scale];
CGContextRef context = UIGraphicsGetCurrentContext();
CGContextScaleCTM(context, scale, scale);

2

Swift版本:

textLayer.contentsScale = UIScreen.mainScreen().scale

enter image description here


1
一组函数控制着Core Graphics如何呈现字体:
  • CGContextSetAllowsAntialiasing
  • CGContextSetAllowsFontSmoothing
  • CGContextSetAllowsFontSubpixelPositioning
  • CGContextSetAllowsFontSubpixelQuantization

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接