2014-08-28 47 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]但他們似乎沒有按預期工作。在僅列出三列值的文本之後,它們返回整個字符串的長度,而不是第一個字符不適合第一列的位置。這就是爲什麼我寧願使用基於範圍的方法。

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