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

时间:2015-03-16 15:28:45

标签: cocoa calayer nslayoutmanager nstextstorage

我使用NSLayoutManager, NSTextStorage & NSTextContainer的三重奏来渲染支持图层的NSView中的文字。

如果我可以覆盖wantsUpdateLayer以返回true并因此更充分地使用图层,那么我认为该视图将更具性能。 这是真的吗?

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

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

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

1 个答案:

答案 0 :(得分:0)

我创建了一个自定义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方法中实现同样的效果,因为它没有使用上下文。