如何在OS X上的CALayer上获得平滑/清晰的文本

时间:2015-02-12 16:42:36

标签: objective-c cocoa swift calayer

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

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

我无法使用 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,如下所示:

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

1 个答案:

答案 0 :(得分:2)

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

对于上面的代码,在视网膜上平滑地呈现字体并与其他人一致,看来你还需要设置:

textLayer.contentsScale = 2.0

在NSView子类中。

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