Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/35.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone 找出矩形中字体字符串的行数?_Iphone_Objective C_Ios_Uitextview - Fatal编程技术网

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

Iphone 找出矩形中字体字符串的行数?,iphone,objective-c,ios,uitextview,Iphone,Objective C,Ios,Uitextview,我想知道当设置为矩形内的字体时,字符串将有多少行。有办法做到这一点吗 我有这段代码,但我正试图让它处理得更快一点,因为它在滚动视图中被大量使用: CGSize maximumSize = CGSizeMake(MESSAGE_FRAME.size.width - 16, 1000000); CGSize expectedSize = [message sizeWithFont:[UIFont fontWithName:@"Crimson" size:15]

我想知道当设置为矩形内的字体时,字符串将有多少行。有办法做到这一点吗

我有这段代码,但我正试图让它处理得更快一点,因为它在滚动视图中被大量使用:

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]);

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

我想不出替代方法,我怀疑是否有一种方法会更有效(毕竟,有什么可能的魔法可以达到行计数并避免换行计算?)

不管怎样,不要伤害我们的大脑,而是在计算过程中刮除循环,考虑是否需要在视图滚动时反复进行。我猜不是


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

我不知道有什么不同的方法,但我有一个小建议,我在表视图的类似情况下做过。如果您的数据存储在某个地方(在我的例子中,我从网络接收文本并将其存储在数据库中),我仅在第一次接收文本时使用这种方法计算大小,然后存储此答案。加载数据时,我将大小放入数组中,以便快速检索值

只是一个建议,我希望它能帮助您。

对于iOS7及更高版本,请使用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
}
func numberOfLinesForString(string:string,size:CGSize,font:UIFont)->Int{
让textStorage=NSTextStorage(字符串:字符串,属性:[NSFontAttributeName:font])
让textContainer=NSTextContainer(大小:size)
textContainer.lineBreakMode=.ByWordWrapping
textContainer.maximumNumberOfLines=0
textContainer.lineFragmentPadding=0
让layoutManager=NSLayoutManager()
layoutManager.textStorage=textStorage
layoutManager.addTextContainer(textContainer)
var numberOfLines=0
var指数=0
变量lineRange:NSRange=NSMakeRange(0,0)
对于(;索引
expectedSize.height/font lineHeight是否为您提供了合理的结果?