首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >澄清NSLayoutManager和NSTextContainer在垂直布局方面的行为?

澄清NSLayoutManager和NSTextContainer在垂直布局方面的行为?
EN

Stack Overflow用户
提问于 2015-03-11 18:25:36
回答 1查看 1.3K关注 0票数 3

代码样本

在自定义NSLayoutManager, NSTextContainer & NSTextStorage (而不是TextView)中,NSView作为属性在awakeFromNib()中初始化,如下所示:

代码语言:javascript
复制
    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中,我包括下面的线条来绘制文本:

代码语言:javascript
复制
let glyphRange = layoutManager.glyphRangeForTextContainer(textContainer)
self.lockFocus()
layoutManager.drawGlyphsForGlyphRange(glyphRange, atPoint: NSMakePoint(0, 0))
self.unlockFocus()

调查结果

  1. 这似乎最好与您的自定义视图在一个翻转的协调系统,如NSTextView,否则,我觉得我将在一个痛苦的世界!不管这一点,NSLayoutManager总是在翻转的协调系统中开始在内部绘制文本(就像NSTextView一样)。
  2. containerSize.width属性NSTextContainer的作用如下:它绑定到所有级别的行级,包括第一个级别(我知道这很明显,但请记住……)
  3. containerSize.height属性NSTextContainer有一个曲线球:它不会绑定在第一行上,即使包含的视图没有垂直显示它的空间,而是在后续的行上绑定。

*我花了很长时间才得出关于containerSize.height的这个假说,因为我只画了一条线!*

问题

  1. 我对NSTextContainer的结论正确吗?
  2. 从垂直角度控制文本绘制的最佳方法是什么?我希望将文本的一行放在视图的底部(而不是像默认情况那样在顶部浮动)。
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-03-11 18:36:07

NSTextContainer有一个containerSize属性。布局管理器正在该容器中布局文本。想必,容器在您的视图中的逻辑位置是(0,0),但是文本是从它的顶部排列的。因此,容器是松弛的。

您可以根据从-[NSLayoutManager usedRectForTextContainer:]返回的rect来调整容器的大小以适应它的大小。

更新:

我认为在您的drawRect()中这样的代码应该适用于您想要实现的目标:

代码语言:javascript
复制
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)
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28994528

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档