找出矩形中带字体的字符串的行数?

时间:2012-05-17 14:53:06

标签: iphone objective-c ios uitextview

我想知道一个字符串在设置为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]);

因此,如果我可以将其乘以另一个值,则可能会更快。

3 个答案:

答案 0 :(得分:3)

我无法想到另一种选择,我怀疑有哪一种更有效率(毕竟,可能的魔法可以获得一个行计数并避免自动换行计算?)。

无论如何,考虑是否需要在视图滚动时反复进行,而不是伤害我们的大脑剃须周期。我的猜测是否定的。

我认为加快速度的方法是进行传统的大小计算并缓存结果。

答案 1 :(得分:2)

我不知道另一种方式,但我有一个小建议,我在表格视图中的类似情况。如果您的数据存储在某个地方(在我的情况下,我从网络接收文本并将其存储在数据库中),我只在第一次接收文本时使用这种方式计算大小,然后存储此答案。加载数据时,我将大小放在一个数组中,这样我就可以快速检索这些值。

只是一个建议,我希望它可以帮到你。

答案 2 :(得分: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
}