上篇文章《富文本用法总结》详细码了关于富文本的一些用法,有介绍行间距的设置方法.在实际开发中经常需要根据后台返回的文字计算控件宽度和高度进行布局,这篇就配合上一篇来设置字间距和计算高度.
UILabel * label = [[UILabel alloc] initWithFrame:CGRectMake(50, 200, 300, 800)];
label.layer.borderColor = [UIColor blackColor].CGColor;
label.numberOfLines = 0;
[self.view addSubview:label];
NSString * string = @"许多回忆 藏在心底\n总来不及 都告诉你\n和你一起 爬过山顶 入过海里\n难免粗心 时而大意\n难过开心 你都参与\n笑到抽筋 哭到决堤\n和你一起 想去东京 飞到巴黎";
// 初始化NSMutableAttributedString,并设置文字样式
NSMutableAttributedString * attributedString = [[NSMutableAttributedString alloc] initWithString:string];
// 设置行间距
NSMutableParagraphStyle * paragraphStyle = [[NSMutableParagraphStyle alloc] init];
[paragraphStyle setLineSpacing:10];
[attributedString addAttribute:NSParagraphStyleAttributeName value:paragraphStyle range:NSMakeRange(0, string.length)];
// 设置字间距 NSKernAttributeName
// 取值为NSNumer 正值距离加宽,负值距离变窄
[attributedString addAttribute:NSKernAttributeName value:@(10) range:NSMakeRange(0, 20)];
[attributedString addAttribute:NSKernAttributeName value:@(-2) range:NSMakeRange(40, 20)];
label.attributedText = attributedString;
[label sizeToFit];
之前一直用 sizeToFit 来让 label 自适应高度,下面通过字符串来计算获取 label 所对应的高度
UILabel * label = [[UILabel alloc] initWithFrame:CGRectMake(50, 200, 300, 100)];
label.backgroundColor = [UIColor magentaColor];
label.numberOfLines = 0;
[self.view addSubview:label];
NSString * string = @"许多回忆 藏在心底\n总来不及 都告诉你\n和你一起 爬过山顶 入过海里\n难免粗心 时而大意\n难过开心 你都参与\n笑到抽筋 哭到决堤\n和你一起 想去东京 飞到巴黎";
// 初始化NSMutableAttributedString,并设置文字样式
NSMutableAttributedString * attributedString = [[NSMutableAttributedString alloc] initWithString:string];
NSMutableParagraphStyle * paragraphStyle = [[NSMutableParagraphStyle alloc] init];
[paragraphStyle setLineSpacing:10];
NSDictionary *dic = @{NSFontAttributeName:[UIFont systemFontOfSize:15 weight:UIFontWeightMedium], NSParagraphStyleAttributeName:paragraphStyle, NSKernAttributeName:@1.5f};
// 计算文字高度 这里固定了宽度计算高度,如果高度固定计算宽度的话就设置宽为 MAXFLOAT
CGSize size = [string boundingRectWithSize:CGSizeMake(300, MAXFLOAT) options:NSStringDrawingUsesLineFragmentOrigin attributes:dic context:nil].size;
// 这里有个坑,如果上面 diction 内只设置行间距的话,下面计算高度的时候就不会识别\ n ,然而我也不知道为啥~~~~求解
[attributedString addAttributes:dic range:NSMakeRange(0, string.length)];
label.attributedText = attributedString;
label.frame = CGRectMake(50, 200, 300, size.height);