iOS 动态计算文本内容的高度

关于ios 下动态计算文本内容的高度,经过查阅和网上搜素,现在看到的有以下几种方法:

1、

//  获取字符串的大小  ios6

- (CGSize)getStringRect_:(NSString*)aString {

    CGSize size;

    UIFont *nameFont=[UIFont fontWithName:@"Helvetica" size:13];

    size=[aString sizeWithFont:nameFont constrainedToSize:CGSizeMake(237, 200) lineBreakMode:NSLineBreakByCharWrapping];

    return  size;

}

 

//  获取字符串的大小  ios7

- (float)heightForString:(NSString *)value andWidth:(float)width withFontSize:(CGFloat)fontSize{

    //获取当前文本的属性

    NSAttributedString *attrStr = [[NSAttributedString alloc] initWithString:value];

    NSRange range = NSMakeRange(0, attrStr.length);

    // 获取该段attributedString的属性字典

    NSDictionary *dic = [attrStr attributesAtIndex:0 effectiveRange:&range];

    // 计算文本的大小

    CGSize sizeToFit = [value boundingRectWithSize:CGSizeMake(width, CGFLOAT_MAX) // 用于计算文本绘制时占据的矩形块

                                           options:NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingUsesFontLeading // 文本绘制时的附加选项

                                        attributes:dic        // 文字的属性

                                           context:nil

                               ].size; // context上下文。包括一些信息,例如如何调整字间距以及缩放。该对象包含的信息将用于文本绘制。该参数可为nil

    return sizeToFit.height;

}

以上方法还是依靠CGSizeMake(237,200) 中的200来设置 label 的高度的,而且无论在有效宽度范围内形成多少行,计算出来的 label 的高度只是一行的高度。

 下面的方法依然如此: 

- (CGSize)boundingRectWithSize:(CGSize)size
{
NSDictionary *attribute = @{NSFontAttributeName: self.font};
CGSize retSize = [self.text boundingRectWithSize:size
options:\
NSStringDrawingTruncatesLastVisibleLine |
NSStringDrawingUsesLineFragmentOrigin |
NSStringDrawingUsesFontLeading
attributes:attribute
context:nil
].size;
return retSize;
}

以下代码供你测试:

  // 字符串
    NSString *str = @"日落时分,沏上一杯山茶,听一曲意境空远的《禅》,心神随此天籁,沉溺于玄妙的幻境里。仿佛我就是那穿梭于葳蕤山林中的一只飞鸟,时而盘旋穿梭,时而引吭高歌;仿佛我就是那潺潺流泻于山涧的一汪清泉,涟漪轻盈,浩淼长流;仿佛我就是那竦峙在天地间的一座山峦,伟岸高耸,从容绵延。我不相信佛,只是喜欢玄冥空灵的梵音经贝,与慈悲淡然的佛境禅心,在清欢中,从容幽静,自在安然。一直向往走进青的山,碧的水,体悟山水的绚丽多姿,领略草木的兴衰荣枯,倾听黄天厚土之声,探寻宇宙自然的妙趣。走进了山水,也就走出了喧嚣,给身心以清凉,给精神以沉淀,给灵魂以升华。";
    
    // 初始化label
    UILabel *label = [UILabel new];
    label.backgroundColor = [UIColor whiteColor];
    [self.view addSubview:label];
    
    // label获取字符串
    label.text = str;

    // label获取字体
    label.font = [UIFont fontWithName:nil size:18];
    
    // 根据获取到的字符串以及字体计算label需要的size
    CGSize size = [label boundingRectWithSize:CGSizeMake(320, 0)];
    
    // 设置无限换行
    label.numberOfLines = 0;
    
    // 设置label的frame
    label.frame = CGRectMake(0.0f, 50.0f, size.width, size.height);
复制代码 

 

最后,仔细研究,sizeWithFont 这个方法貌似确实是针对UILabel的,如果用UILabel来显示,其计算出来的高度和实际高度是吻合的。但是需要注意的是UILabel的文字内容和UILabel的宽度几乎是重合的,这会让人觉得文字太过于帖边了,可以考虑设置其 contentInset之类来处理,不过这个是另一个问题了。而 UITextView 则不会太帖边,且行间距较大,适合显示。所以使用如下方法即可解决:
 

//声明、定义方法:

- (float)heightForString:(NSString *)value andWidth:(float)width withFontSize:(CGFloat)fontSize{

    // 使用UITextView 的 sizeThatFits 方法计算出字符串的高度后再给 UILabel 使用

    UITextView *detailTextView = [[UITextView alloc]initWithFrame:CGRectMake(0, 0, width, 0)];

    detailTextView.font = [UIFont systemFontOfSize:fontSize];

    detailTextView.text = value;

    CGSize deSize = [detailTextView sizeThatFits:CGSizeMake(width,CGFLOAT_MAX)];

    return deSize.height;

}

//使用计算:

// 字符串
    NSString *conText = @"日落时分,沏上一杯山茶,听一曲意境空远的《禅》,心神随此天籁,沉溺于玄妙的幻境里。仿佛我就是那穿梭于葳蕤山林中的一只飞鸟,时而盘旋穿梭,时而引吭高歌;仿佛我就是那潺潺流泻于山涧的一汪清泉,涟漪轻盈,浩淼长流;仿佛我就是那竦峙在天地间的一座山峦,伟岸高耸,从容绵延。我不相信佛,只是喜欢玄冥空灵的梵音经贝,与慈悲淡然的佛境禅心,在清欢中,从容幽静,自在安然。一直向往走进青的山,碧的水,体悟山水的绚丽多姿,领略草木的兴衰荣枯,倾听黄天厚土之声,探寻宇宙自然的妙趣。走进了山水,也就走出了喧嚣,给身心以清凉,给精神以沉淀,给灵魂以升华。";

    CGFloat conH = [self heightForString:conText andWidth:200 withFontSize:14];

    UILabel *contentLabel = [[UILabel alloc]init];

    contentLabel.textAlignment = NSTextAlignmentCenter;

    contentLabel.text = conText;

    contentLabel.numberOfLines = 0;

    [contentLabel setFrame:CGRectMake(0, 0, 200, conH)];

    [self.view addSubView:contentLabel];

posted @ 2016-04-11 12:37  AntonyGu  阅读(810)  评论(0编辑  收藏  举报