如何计算NSAttributedString的高度,给定宽度和行数?

lic*_*853 11 nsattributedstring

我想显示3行NSAttributedString.有没有办法根据宽度和线数找出所需的高度?

而且我不想创建UILabel来进行大小计算,因为我希望计算在后台线程中完成.

dez*_*ync 6

我想知道为什么这仍然没有答案.无论如何,这是最适合我的方法.

创建一个名为"Height"的NSAttributedString类别.这应该生成两个名为"NSAttributedString + Height.{h,m}"的文件.

在.h文件中:

@interface NSAttributedString (Height)  
-(CGFloat)heightForWidth:(CGFloat)width;  
@end  
Run Code Online (Sandbox Code Playgroud)

在.m文件中:

-(CGFloat)heightForWidth:(CGFloat)width  
{  
    return ceilf(CGRectGetHeight([self boundingRectWithSize:CGSizeMake(width, CGFLOAT_MAX)
                                                    options:NSStringDrawingUsesLineFragmentOrigin|NSStringDrawingUsesFontLeading
                                                    context:nil])) + 1;  
}
Run Code Online (Sandbox Code Playgroud)

这是发生了什么:

  1. boundRectWithSize:options:context get是一个约束到传递给方法的宽度的矩形.NSStringDrawingUsesLineFragmentOrigin选项告诉它期望多行字符串.
  2. 然后我们从那个rect获取height参数.
  3. 在iOS 7中,此方法返回小数.我们需要一个圆形的人物.ceilf对此有所帮助.
  4. 我们在返回值中添加了一个额外的单位.

这是如何使用它

NSAttributedString *string = ...
CGFloat height = [string heightForWidth:320.0f];
Run Code Online (Sandbox Code Playgroud)

您可以使用该高度进行布局计算.

  • @ezinezync你只需计算指定宽度内的高度,但如何将高度限制为3行??? (2认同)

tro*_*ish 5

@dezinezync 的回答回答了问题的一半。您只需要计算给定宽度和行数的 UILabel 允许的最大尺寸。

首先,根据行数获取允许的高度:

let maxHeight = font.lineHeight * numberOfLines
Run Code Online (Sandbox Code Playgroud)

然后根据条件计算您设置的文本的边界矩形:

let labelStringSize = yourText.boundingRectWithSize(CGSizeMake(CGRectGetWidth(self.frame), maxHeight),
            options: NSStringDrawingOptions.UsesLineFragmentOrigin,
            attributes: [NSFontAttributeName: font],
            context: nil).size
Run Code Online (Sandbox Code Playgroud)