我的智慧结束了。我已经尝试了我认为的一切,以摆脱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];
}
我错过了什么?
答案 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.
}