2014-08-28 89 views
3

我的工作,它使用TextKit框架排版文字列这样的观点:计算10 Column Text Layout计算文本大小与NSLayoutManager

我用我的UIView的界限与边缘插图(黑色矩形) CGRects然后我转换成NSTextContainers(红色矩形)。在drawRect:我将这些传递给NSLayoutManager,它为我排版和绘制字形。我的问题是:如何计算所需的列数?我可以绘制恒定数量的列,但具有不同的文本长度,我需要以编程方式调整列数。

我发现方法[NSLayoutManager glyphRangeForTextContainer:]当文本容器留空时,它返回长度为0的范围。因此,我可以循环创建文本容器并使用此方法来确定是否需要更多容器。然而,这种方法被认为是低效的,因为它会触发布局计算,我不会很高兴在一个循环中运行它,可能会有数百次。

必须有更好的方法!

感谢您的回答,皮特。

+0

你有样品项目吗? – karthikeyan 2017-01-04 07:37:05

回答

3

那么,经过一些挖掘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]但他们似乎没有按预期工作。在仅列出三列值的文本之后,它们返回整个字符串的长度,而不是第一个字符不适合第一列的位置。这就是为什么我宁愿使用基于范围的方法。

这就是所有人,安全! 皮特。