具有缩放变换的模糊CATextLayer

时间:2015-10-19 22:05:06

标签: cocoa text core-animation blurry catextlayer

我的智慧结束了。我已经尝试了我认为的一切,以摆脱CATextLayer模糊无济于事。不可否认,有些事情会有所帮助,但是当放大2倍并且远离非CATextLayer文字的清晰度时,文字仍然太模糊。

这是我的情况。我有一个图层托管的视图,其中可以包含许多子图层,包括CATextLayers(在自定义CALayer容器内)。现在,用户可以缩放主内容层(包含所有子图层内容),这是通过将缩放变换应用于内容层来完成的。

以下是我目前正在做的事情。大多数都有所不同,尽管差别不是很大。如果我一直放大(这是2倍比例因子),我会得到严重模糊的文字。

  • 确保积分坐标 - 起作用并产生明显差异,但在2倍规模下仍然太模糊

  • 关闭CATextLayer容器图层上的阴影 - 虽然不是2倍规模但有所不同

  • 确保文本图层的背景颜色完全不透明 - 虽然不是2倍规模但似乎有所不同

  • contentsScale属性设置为所有图层的窗口背衬比例因子 - 虽然不是2倍比例但似乎有所不同

  • 覆盖此自定义-drawInContext:子类的CATextLayer以平滑,消除别名和子像素量化所有内容 - 字体呈现更加真实,但仍然模糊2倍规模

代码片段:

- (void) drawInContext:(CGContextRef)context
{
    // Allow font smoothing.
    CGContextSetAllowsAntialiasing(context, YES);
    CGContextSetAllowsFontSmoothing(context, YES);
    CGContextSetAllowsFontSubpixelPositioning(context, YES);
    CGContextSetAllowsFontSubpixelQuantization(context, YES);

    // Set drawing attributes.
    CGContextSetStrokeColorWithColor(context, self.foregroundColor);
    CGContextSetFillColorWithColor(context, self.backgroundColor);
    CGContextFillRect(context, self.bounds);

    // Font smoothing.
    CGContextSetShouldAntialias(context, YES);
    CGContextSetShouldSmoothFonts(context, YES);
    CGContextSetShouldSubpixelPositionFonts(context, YES);
    CGContextSetShouldSubpixelQuantizeFonts(context, YES);

    [super drawInContext:context];
}

我错过了什么?

1 个答案:

答案 0 :(得分:1)

对于最清晰的文本,除了原始问题中提到的所有内容之外,影响最大的解决方案是将文本图层的contentsScale值加倍到窗口支持比例因子的两倍 - 如果您需要以2倍变焦支持清晰文本。

如果您想在较高的缩放值下支持清晰文本,请使用应用程序的最大缩放系数作为调整后的contentsScale。例如,您可以通过覆盖自定义-setContentsScale:子类的CATextLayer来执行此操作:

- (void) setContentsScale:(CGFloat)contentsScale
{
    [super setContentsScale:contentsScale * kMaxZoomFactor];
}

请注意,请确保通过覆盖图层托管视图的-viewDidChangeBackingProperties,将更改以查看支持属性(例如,更改为具有更高分辨率的屏幕)传播到图层托管的层次结构:

- (void) viewDidChangeBackingProperties
{
    // Propagate self.window.backingScaleFactor change to layer hierarchy.
}