如何使用 NSLayoutManager 在 CALayer 中呈现文本?

How to render text in a CALayer using NSLayoutManager?

我正在使用 NSLayoutManager, NSTextStorage & NSTextContainer 的三重奏在图层支持 NSView 中呈现文本。

我的印象是,如果我可以将 wantsUpdateLayer 覆盖为 return true 并因此更充分地使用层,则视图的性能会更高。 这是真的吗?

但是,我看到的所有使用 NSLayoutManager 的示例都表示您需要在 drawRect 中放置以下调用:

layoutManager.drawGlyphsForGlyphRange(glyphRange, atPoint: NSMakePoint(0, 0)) 

您将如何在 updateLayer 或其他更面向图层的地方执行等效调用?

我创建了一个自定义 CALayer 并覆盖了 drawInContext 方法,如下所示:

override func drawInContext(ctx: CGContext!) {
    NSGraphicsContext.saveGraphicsState()

    var nsgc = NSGraphicsContext(CGContext: ctx, flipped: false)
    NSGraphicsContext.setCurrentContext(nsgc)

    NSColor.whiteColor().setFill()
    NSRectFill(NSMakeRect(0, 0, 84, 24))

    lm.drawGlyphsForGlyphRange(glyphRange, atPoint: NSMakePoint(0, 0))  // location of textContainer

    NSGraphicsContext.restoreGraphicsState()

}

这样就完成了工作,但是

  1. 我不确定如上所述保存和恢复图形上下文是否对性能有任何影响。
  2. 我不确定在 NSView 的 updateLayer 方法中如何实现同样的效果,因为它没有要使用的上下文。