我想知道一个字符串在设置为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 :(得分: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
}