2

我无计可施。我已经尝试了我认为的一切来摆脱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];
}

我错过了什么?

4

1 回答 1

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.
}
于 2015-10-19T22:05:06.103 回答