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

时间: 2024-11-08 18:28:25

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

根据文本内容动态计算文本框高度的步骤

在视图加载的过程中,是先计算出frame,再根据frame加载视图的,所以在设计计算高度的方法的时候,设计成加号方法; //首先给外界提供计算cell高度的方法 + (CGFloat)heightForRowWithDic:(NSDictionary *)dic { //cell高度 = nameLabel高度 + contentLabel高度 + 间距; return [self heightForText:dic[@"content"]] + 30 + kHeight_NameLa

IOS开发计算文本尺寸

在IOS开发中例如微博,QQ聊天界面中要显示大量的文字信息,这样需要计算出文字部分的尺寸,才能设计出合适的控件尺寸和位置.下面是IOS 7.0计算文本尺寸的方法.- (CGRect)boundingRectWithSize:(CGSize)size options:(NSStringDrawingOptions)options attributes:(NSDictionary *)attributes context:(NSStringDrawingContext *)context NS_AV

伪元素练习( css动态设置文本内容)

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" con

iOS 动态计算行高,宽等

UILabel有两个计算文字大小的方法: 1.针对对富文本计算NSAttributedString - (CGRect)boundingRectWithSize:(CGSize)size options:(NSStringDrawingOptions)options attributes:(nullable NSDictionary*)attributes context:(nullable NSStringDrawingContext *)context NS_AVAILABLE(10_11,

iOS 动态计算cell高度实用API

// Use the estimatedHeight methods to quickly calcuate guessed values which will allow for fast load times of the table. // If these methods are implemented, the above -tableView:heightForXXX calls will be deferred until views are ready to be display

swift - 动态计算文本高度

func heightOfCell(text : String) -> CGFloat {        let attributes = [NSFontAttributeName:UIFont.systemFontOfSize(14)]        let option = NSStringDrawingOptions.UsesLineFragmentOrigin        let rect:CGRect = text.boundingRectWithSize(CGSize(width:

iOS动态计算Label的宽高

1.根据文字计算Label的宽度 1 +(CGFloat)widthOfString:(NSString *)string font:(UIFont *)font height:(CGFloat)height 2 { 3 NSDictionary * dict=[NSDictionary dictionaryWithObject: font forKey:NSFontAttributeName]; 4 CGRect rect=[string boundingRectWithSize:CGSize

iOS之UILabel根据内容自动调整高度

写法一:对象方法,传入:字体/最大尺寸. 即可得到宽高, 最大尺寸主要限制宽度,如果是一行就给个{MAXFLOAT,MAXFLOAT};如果是多行就限制X值,Y值随便给 - (CGSize)sizeWithFont:(UIFont *)font maxSize:(CGSize)maxSize { NSDictionary *attrs = @{NSFontAttributeName : font}; return [self boundingRectWithSize:maxSize option

iOS动态计算UIScrollView的contentSize示例(页面由Label组成)

1 #import "ViewController.h" 2 3 @interface ViewController () 4 { 5 UIScrollView *_scrollView; 6 } 7 //数据源 8 @property (nonatomic,strong)NSArray *dataArray; 9 10 @end 11 12 @implementation ViewController 13 14 - (void)viewDidLoad { 15 [super vie