【发布时间】:2015-03-11 18:25:36
【问题描述】:
代码示例
我有一个NSLayoutManager, NSTextContainer & NSTextStorage 作为在awakeFromNib() 中初始化的自定义NSView(不是TextView)中的属性,如下所示:
textStorage = NSTextStorage(attributedString: self.attributedString)
layoutManager = NSLayoutManager()
textContainer = NSTextContainer(containerSize: NSMakeSize(self.frame.size.width, 1))
layoutManager.addTextContainer(textContainer)
textStorage.addLayoutManager(layoutManager)
layoutManager.glyphRangeForTextContainer(textContainer)
NSTextContainer 的垂直containerSize 故意设置为 1,以查看它是否具有隐藏正在呈现的文本的预期效果 - 它没有!它使视图中此文本的呈现NO有所不同 - 这是问题的主题!
在drawRect 中,我包含以下行来绘制文本:
let glyphRange = layoutManager.glyphRangeForTextContainer(textContainer)
self.lockFocus()
layoutManager.drawGlyphsForGlyphRange(glyphRange, atPoint: NSMakePoint(0, 0))
self.unlockFocus()
调查结果
- 似乎最好在翻转坐标系中使用您的自定义视图,例如
NSTextView,否则我觉得我将进入一个痛苦的世界!无论如何,NSLayoutManager 总是开始在一个翻转的坐标系统内部绘制它的文本(就像NSTextView) -
NSTextContainer的containerSize.width属性具有以下效果:它在行级别上绑定所有级别,包括第一个级别(我知道这很明显,但坚持我...) -
NSTextContainer的containerSize.height属性有一个曲线球:它不会绑定在第一行 即使包含的视图没有空间垂直显示它但会对后续行具有约束力
*我花了很长时间才得出这个关于containerSize.height 的假设,因为我只画了一条线! *
问题
- 我关于
NSTextContainer的结论是否正确? - 从垂直角度控制文本绘制的最佳方法是什么?我想将我的单行文本放在视图的底部(而不是像默认情况下那样浮动在顶部)
【问题讨论】:
标签: objective-c cocoa swift nsview nslayoutmanager