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

Cocoa 如何使用NSLayoutManager在CALayer中呈现文本?,cocoa,calayer,nslayoutmanager,nstextstorage,Cocoa,Calayer,Nslayoutmanager,Nstextstorage,我正在使用NSLayoutManager、NSTextStorage和NSTextContainer这三个组件来渲染以NSView为背景的层中的文本 我的印象是,如果我可以覆盖wantsUpdateLayer以返回true,从而更充分地使用层,那么视图的性能将更高这是真的吗? 但是,我看到的所有使用NSLayoutManager的示例都表明,您需要在drawRect中进行以下调用: layoutManager.drawGlyphsForGlyphRange(glyphRange, atPoint

我正在使用
NSLayoutManager、NSTextStorage和NSTextContainer这三个组件来渲染以
NSView
为背景的层中的文本

我的印象是,如果我可以覆盖
wantsUpdateLayer
以返回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()

}
这就完成了任务,但是

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

  • 在UIKit中,视图只是处理用户交互的CALayer的包装器。在OSX上,我以类似的方式使用自定义视图来绘制文本。因此,在CALayer中绘图不是问题。每次drawInContext调用保存和恢复graphicscontext一次或两次不应该是问题。但是,不要在同一个函数中多次调用它。如果代码看起来很慢,您可以随时分析代码。