如何使用 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()
}
这样就完成了工作,但是
- 我不确定如上所述保存和恢复图形上下文是否对性能有任何影响。
- 我不确定在 NSView 的
updateLayer
方法中如何实现同样的效果,因为它没有要使用的上下文。
我正在使用 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()
}
这样就完成了工作,但是
- 我不确定如上所述保存和恢复图形上下文是否对性能有任何影响。
- 我不确定在 NSView 的
updateLayer
方法中如何实现同样的效果,因为它没有要使用的上下文。