2012-05-17 24 views
0

我想知道在rect中設置字體時字符串有多少行。有沒有辦法做到這一點?找出在一個矩形字符串中的行數?

我有這樣的代碼,但我要把它處理的是有點快,因爲它是被使用了很多在滾動視圖:

CGSize maximumSize = CGSizeMake(MESSAGE_FRAME.size.width - 16, 1000000); 

    CGSize expectedSize = [message sizeWithFont:[UIFont fontWithName:@"Crimson" size:15] 
           constrainedToSize:maximumSize 
            lineBreakMode:UILineBreakModeWordWrap]; 

return expectedSize.height; 

我知道這將返回線高度:

NSLog(@"%f", [[UIFont fontWithName:@"Crimson" size:15] lineHeight]); 

所以,如果我可以乘以另一個值,它可能會證明更快。

+0

不expectedSize.height/FONT線高給你一個合理的結果? – pdriegen

回答

3

我想不出一種替代方案,我懷疑有一種方法效率會更高(畢竟,有什麼可能的魔法可以達到行計數並避免單詞換算?)。

無論如何,不​​要傷害我們的大腦削減週期的計算,考慮是否需要一遍又一遍地完成視圖滾動。我的猜測是否定的。

我認爲加快這一點的方法是做傳統的大小計算和緩存結果。

2

我不知道一個不同的方式,但我有一個小建議,我在一個類似的情況下做了一個表視圖。如果您的數據存儲在某處(在我的情況下,我從網絡接收文本並將其存儲在數據庫中),我只在第一次接收文本時使用這種方式計算大小,然後存儲此答案。加載數據時,我把大小放在一個數組中,這樣我就可以快速檢索這些值。

只是一個建議,我希望它可以幫助你。

+0

有趣。它可能會。 – Andrew

+0

好消息,我希望:) – antf

2

對於iOS7及以上,officially sanctioned way是使用TextKit:

func numberOfLinesForString(string: String, size: CGSize, font: UIFont) -> Int { 
    let textStorage = NSTextStorage(string: string, attributes: [NSFontAttributeName: font]) 

    let textContainer = NSTextContainer(size: size) 
    textContainer.lineBreakMode = .ByWordWrapping 
    textContainer.maximumNumberOfLines = 0 
    textContainer.lineFragmentPadding = 0 

    let layoutManager = NSLayoutManager() 
    layoutManager.textStorage = textStorage 
    layoutManager.addTextContainer(textContainer) 

    var numberOfLines = 0 
    var index = 0 
    var lineRange : NSRange = NSMakeRange(0, 0) 
    for (; index < layoutManager.numberOfGlyphs; numberOfLines++) { 
     layoutManager.lineFragmentRectForGlyphAtIndex(index, effectiveRange: &lineRange) 
     index = NSMaxRange(lineRange) 
    } 

    return numberOfLines 
} 
相關問題