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

我使用带有边缘嵌入(黑色矩形)的UIView边界来计算10 CGRects,然后将其转换为NSTextContainers (红色矩形)。在drawRect:中,我将这些边界传递给打字和为我绘制象形文字的NSLayoutManager。
我的问题是:如何计算所需的列数?我可以画出固定的列数,但在不同的文本长度下,我需要以编程方式调整列的数量。
我找到了[NSLayoutManager glyphRangeForTextContainer:]方法,当文本容器被空时,它返回长度为0的范围。因此,我可以循环创建文本容器,并使用此方法来确定是否需要更多的容器。但是,据说这种方法效率低下,因为它触发了布局计算,我不喜欢在一个循环中运行它--可能会重复数百次。
一定有更好的办法!
谢谢你的回答皮特。
发布于 2014-08-29 09:22:34
嗯,在深入研究了TextKit框架之后,我终于找到了答案。
我的代码在这样的循环中工作:
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],但它们似乎不像预期的那样起作用。在只在一列中放置三列文本之后,它们返回整个字符串的长度,而不是第一列中不适合的第一个字符的位置。这就是为什么我宁愿使用基于范围的方法。
伙计们,注意安全!皮特。
https://stackoverflow.com/questions/25546643
复制相似问题