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一次或两次不应该是问题。但是,不要在同一个函数中多次调用它。如果代码看起来很慢,您可以随时分析代码。