代码样本
在自定义NSLayoutManager, NSTextContainer & NSTextStorage (而不是TextView)中,NSView作为属性在awakeFromNib()中初始化,如下所示:
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的垂直NSTextContainer设置为1,以查看它是否具有隐藏正在呈现的文本的预期效果--它没有!它使在视图中呈现文本时没有差异--这是问题的主题!
在drawRect中,我包括下面的线条来绘制文本:
let glyphRange = layoutManager.glyphRangeForTextContainer(textContainer)
self.lockFocus()
layoutManager.drawGlyphsForGlyphRange(glyphRange, atPoint: NSMakePoint(0, 0))
self.unlockFocus()调查结果
NSTextView,否则,我觉得我将在一个痛苦的世界!不管这一点,NSLayoutManager总是在翻转的协调系统中开始在内部绘制文本(就像NSTextView一样)。containerSize.width属性NSTextContainer的作用如下:它绑定到所有级别的行级,包括第一个级别(我知道这很明显,但请记住……)containerSize.height属性NSTextContainer有一个曲线球:它不会绑定在第一行上,即使包含的视图没有垂直显示它的空间,而是在后续的行上绑定。*我花了很长时间才得出关于containerSize.height的这个假说,因为我只画了一条线!*
问题
NSTextContainer的结论正确吗?发布于 2015-03-11 18:36:07
NSTextContainer有一个containerSize属性。布局管理器正在该容器中布局文本。想必,容器在您的视图中的逻辑位置是(0,0),但是文本是从它的顶部排列的。因此,容器是松弛的。
您可以根据从-[NSLayoutManager usedRectForTextContainer:]返回的rect来调整容器的大小以适应它的大小。
更新:
我认为在您的drawRect()中这样的代码应该适用于您想要实现的目标:
layoutManager.ensureLayoutForTextContainer(textContainer)
var rect = layoutManager.usedRectForTextContainer(textContainer)
rect.origin.x += 2
rect.origin.y = NSMaxY(self.bounds) - NSHeight(rect) - 4
let glyphRange = layoutManager.glyphRangeForTextContainer(textContainer)
layoutManager.drawGlyphsForGlyphRange(glyphRange, atPoint:rect.origin)https://stackoverflow.com/questions/28994528
复制相似问题