Skip to main content
 首页 » 操作系统

objective-c之如何在 OS X 上的 CALayer 上获得流畅/清晰的文本

2024年01月01日37cloudgamer

在 CALayer 和 CATextLayer 中使用 Cocoa (OS X) 绘制的文本都是颗粒状的。必须使用什么方法才能使文本清晰明了?

我很高兴文本得到不透明背景的支持 - 我知道如果需要透明,问题会更加复杂。

我不能使用 NSView 派生实例(如 NSTextField)来表示我的解决方案中的文本 - 我正在使用 CALayer,因为它更轻量级。

编辑

我正在更新我根据以下评论尝试过的代码:

以下旨在成为自定义 CATextLayer 类,其中背景颜色在与它组合的文本之前被预设为不透明,以便可以进行亚像素抗锯齿:

class TextLayer: CATextLayer { 
 
    override func drawInContext(ctx: CGContext!) { 
 
        CGContextSaveGState(ctx) 
 
        CGContextSetRGBFillColor (ctx, 1, 1, 1, 1) 
        CGContextFillRect (ctx, self.bounds) 
        CGContextSetShouldSmoothFonts (ctx, true) 
        super.drawInContext(ctx) 
 
        CGContextSaveGState(ctx) 
    } 
} 

此自定义派生的 CATextLayer 然后在自定义 View 中使用,如下所示:

    override func awakeFromNib() { 
 
    self.wantsLayer = true 
    var backingLayer = self.layer 
    var textLayer = TextLayer() 
    textLayer.string = "ABC" 
    textLayer.fontSize = 16 
    textLayer.foregroundColor = NSColor.blackColor().CGColor 
    textLayer.frame = NSMakeRect(0, 0, 80, 40) 
 
    backingLayer?.addSublayer(textLayer) 
    textLayer.setNeedsDisplay() 
} 

最终结果在我的视网膜 macBook Pro 上仍然是一张颗粒状的图片。

请您参考如下方法:

在 CALayer 上尝试一些属性产生了解决方案......

为了让上面的代码在视网膜 mac 上流畅地渲染字体并与其他字体保持一致,您似乎还需要设置:

textLayer.contentsScale = 2.0 

在 NSView 子类中。

我的理解是,这会从更接近支持 Retina 的硬件的底层图像生成更详细的位图。