需求点:
有时我们需要根据UILabel内部的字体格式(包括字体大小,行间距)来动态调整UILabel的高度。
笔者在这里提供了两个方法,可以根据UILabel内部特定的字体,行间距,UILabel宽度来获得UILabel内部的真是高度。
动态调整Label的高度一共分为三个步骤:
- 获得具有特定格式的AttributedString。
- 根据AttributedString来获得新高度。
- 重新设置Label的高度。
示例Demo
笔者通过同时显示具有相同内容的Label来对比一下有无动态调整高度的情况。
实现步骤:
1. 获得具有特定格式的AttributedString
/**
* 获取特定格式的属性字符串
*
* @param string 原字符串
* @param font 字体
* @param spacing 行间距
*
* @return 特定格式的属性字符串
*/
- (NSAttributedString *)attributedStringWithString: (NSString *)string andFont: (UIFont *)font andLineSpacing:(CGFloat)spacing
{
NSMutableAttributedString *contentString = [[NSMutableAttributedString alloc] initWithString:string];
[contentString addAttribute:NSFontAttributeName value:font range:NSMakeRange(0, contentString.length)];
NSMutableParagraphStyle * paragraphStyle = [[NSMutableParagraphStyle alloc] init];
[paragraphStyle setAlignment:NSTextAlignmentLeft];
[paragraphStyle setLineSpacing:spacing];
[contentString addAttribute:NSParagraphStyleAttributeName value:paragraphStyle range:NSMakeRange(0, [contentString length])];
return [contentString copy];
}
2. 根据AttributedString来获得高度
/**
* 获取根据特定格式的属性字符串计算的新高度
*
* @param string 特定格式的属性字符串
* @param maxWidth UILable的最宽宽度(换行点)
*
* @return 根据特定格式的属性字符串计算的新高度
*/
- (CGSize)sizeOfAttributedString: (NSAttributedString *)string withMaxWidth: (CGFloat)maxWidth
{
CGRect rect = [string boundingRectWithSize:CGSizeMake(maxWidth, MAXFLOAT) options:NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingUsesFontLeading context:nil];
return rect.size;
}
3. 重新设置Label的高度
NSAttributedString *string = [self attributedStringWithString:self.contentString andFont:[UIFont systemFontOfSize:15.0] andLineSpacing:2.0];
CGSize size = [self sizeOfAttributedString:string withMaxWidth:maxWidth];
self.resizeLabel.frame = CGRectMake((self.view.bounds.size.width - maxWidth)/2, 400, maxWidth, size.height);
self.resizeLabel.attributedText = string;
作为对比,显示具有相同格式内容的UILabel
self.orignalLabel.attributedText = [self attributedStringWithString:self.contentString andFont:[UIFont systemFontOfSize:15.0] andLineSpacing:2.0 ];
效果图:
动态调整Label高度
网友评论