首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用NSLayoutManager计算文本大小

用NSLayoutManager计算文本大小
EN

Stack Overflow用户
提问于 2014-08-28 10:33:07
回答 1查看 1.5K关注 0票数 3

我正在开发一个视图,该视图使用TextKit框架在如下列中排版文本:

我使用带有边缘嵌入(黑色矩形)的UIView边界来计算10 CGRects,然后将其转换为NSTextContainers (红色矩形)。在drawRect:中,我将这些边界传递给打字和为我绘制象形文字的NSLayoutManager

我的问题是:如何计算所需的列数?我可以画出固定的列数,但在不同的文本长度下,我需要以编程方式调整列的数量。

我找到了[NSLayoutManager glyphRangeForTextContainer:]方法,当文本容器被空时,它返回长度为0的范围。因此,我可以循环创建文本容器,并使用此方法来确定是否需要更多的容器。但是,据说这种方法效率低下,因为它触发了布局计算,我不喜欢在一个循环中运行它--可能会重复数百次。

一定有更好的办法!

谢谢你的回答皮特。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-08-29 09:22:34

嗯,在深入研究了TextKit框架之后,我终于找到了答案。

我的代码在这样的循环中工作:

代码语言:javascript
复制
while ([self needsMoreColumns]) {
    [self addColumn];
}

...

- (BOOL)needsMoreColumns {
    // Always create at least one column
    if (self.layoutManager.textContainers.count == 0)
        return YES;

    // Find out the glyph range of the last column
    NSRange range = [self.layoutManager glyphRangeForTextContainer:[self.layoutManager.textContainers lastObject]];
    NSUInteger glyphs = [self.layoutManager numberOfGlyphs];

    // Compare it with the number of glyphs
    return range.location + range.length < glyphs;
}

我没有包括方法[self addColumn],因为它是一个没有头脑。它只是使用我的布局的几何和最后一列(如果有的话)的位置来计算下一列的CGRect。然后,它创建具有各自大小的NSTextContainer,并将矩形的origin属性存储在专用数组中以供绘制。

我还发现了方法[NSLayoutManager firstUnlaidCharacterIndex][NSLayoutManager firstUnlaidGlyphIndex],但它们似乎不像预期的那样起作用。在只在一列中放置三列文本之后,它们返回整个字符串的长度,而不是第一列中不适合的第一个字符的位置。这就是为什么我宁愿使用基于范围的方法。

伙计们,注意安全!皮特。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25546643

复制
相关文章

相似问题

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