【问题标题】:How to get smooth/crisp text on CALayer on OS X如何在 OS X 上的 CALayer 上获得平滑/清晰的文本
【发布时间】:2023-03-09 16:36:01
【问题描述】:

CALayerCATextLayer 中使用Cocoa (OS X) 绘制的文本呈现出颗粒状。必须使用什么方法/方法才能使文本清晰/清晰?

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

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

编辑

我正在使用基于以下 cmets 尝试过的代码进行更新:

以下内容旨在成为自定义 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,如下所示:

    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 上仍然是一张颗粒状的图片。

【问题讨论】:

  • 你试过this question的解决方案了吗?它似乎指向这个cocoa builder articlw,它完成了你想要完成的事情
  • @Petesh 感谢您的链接。正如您将在上面的编辑中看到的那样,我尝试了该建议,但没有给出预期的结果!

标签: objective-c cocoa swift calayer


【解决方案1】:

在 CALayer 上使用一些属性得到了解决方案...

对于上面的代码,要在视网膜 mac 上平滑地渲染字体并与其他字体一致,您似乎还需要设置:

textLayer.contentsScale = 2.0

在 NSView 子类中。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-02-09
    • 1970-01-01
    • 1970-01-01
    • 2016-07-29
    • 1970-01-01
    • 1970-01-01
    • 2014-09-23
    • 2012-03-22
    相关资源
    最近更新 更多