【iOS】 Label设置行距自适应高度

  1. 关于label自适应高度想必只要有一点开发基础的朋友都应该了解,这边我就不多提了,贴上一段自己写的计算的代码。
+ (CGFloat)textHeightFromTextString:(NSString *)text width:(CGFloat)textWidth fontSize:(CGFloat)size{
        if ([Helper getCurrentIOS] >= 7.0) {
        //iOS7之后
        /*
         第一个参数: 预设空间 宽度固定  高度预设 一个最大值
         第二个参数: 行间距 如果超出范围是否截断
         第三个参数: 属性字典 可以设置字体大小
         */
        NSDictionary *dict = @{NSFontAttributeName:[UIFont systemFontOfSize:size]};
        CGRect rect = [text boundingRectWithSize:CGSizeMake(textWidth, MAXFLOAT) options:NSStringDrawingUsesFontLeading|NSStringDrawingUsesLineFragmentOrigin attributes:dict context:nil];
        return rect.size.height; 
    }else {
        //iOS7之前
        /*
         1.第一个参数  设置的字体固定大小
         2.预设 宽度和高度 宽度是固定的 高度一般写成最大值
         3.换行模式 字符换行
         */
        CGSize textSize = [text sizeWithFont:[UIFont systemFontOfSize:size] constrainedToSize:CGSizeMake(textWidth, MAXFLOAT) lineBreakMode:NSLineBreakByCharWrapping];
        return textSize.height;//返回 计算出得行高
        }
    }

项目中很多的label需要根据实际内容计算高度,这个方法能够满足计算动态高度。

  1. 如何设置label的行间距
    如果设置行间距,那么UI可能会比较难看,一般UI需求都会对行间距有一些要求。

    那么如何设置行间距呢?
    如果需要设置行间距,我们的label必须给予attributedText(富文本)而不是普通的text,如果设置text那么行间距固定为0,效果就和上图一样十分不美观。
    我们可以设置一个富文本进行赋值,对行间距赋值就可以达到效果
/* str 显示的字符串
   font 字体大小
   lineHeight 行间距
 */
    - (NSAttributedString *)getAttibuteStringWithString:(NSString *)str textFont:(UIFont *)font lineHeight:(NSInteger)lineHeight{

    NSMutableAttributedString *attributeStr = [[NSMutableAttributedString alloc] initWithString:str];
    NSMutableParagraphStyle *paragrapStyle = [[NSMutableParagraphStyle alloc]init];
    paragrapStyle.lineSpacing = lineHeight;
    NSRange range = NSMakeRange(0, str.length);
    NSDictionary *attribute = @{NSFontAttributeName:font,               NSParagraphStyleAttributeName:paragrapStyle};
    [attributeStr addAttributes:attribute range:range];

    return attributeStr;
}

然后在对label进行赋值,就可以设置行间距了
我们在对他进行刚刚的自适应高度设置

label.attributedText = [self getAttibuteStringWithString:str textFont:[UIFont systemFontOfSize:14] lineHeight:15];
    CGFloat labelHeight = [self textHeightFromTextString:str width:300 fontSize:14];
    [label setFrame:CGRectMake(20, 50, 300, labelHeight)];

效果出来后发现,行间距确实设置了,但是高度不自适应了,这是什么原因呢,原来设置高度的时候我调用的还是原来的设置高度的方法,但是我们现在设置的是设置文本,里面有行间距,如果用原来的方法那么他计算的高度还是按照行间距为0计算,因此我们需要重新写一个方法计算富文本的动态高度。

/* text 显示的字符串
   font 字体大小
   lineHeight 行间距
 */
- (CGFloat)getLabelHeightWithText:(NSString *)text width:(CGFloat)width textFont:(UIFont *)font lineHeight:(NSInteger)lineHeight{

    NSMutableParagraphStyle *paragrapStyle = [[NSMutableParagraphStyle alloc] init];
    paragrapStyle.lineSpacing = lineHeight;
    NSDictionary *attribute = @{NSFontAttributeName:font,
                                NSParagraphStyleAttributeName:paragrapStyle};
    CGRect rect = [text boundingRectWithSize:CGSizeMake(width, MAXFLOAT) options:NSStringDrawingUsesFontLeading|NSStringDrawingUsesLineFragmentOrigin attributes:attribute context:nil];
    return rect.size.height;
}

这里几个注意点
1、传入的宽度必须和label显示的最大宽度一致
2、传入的字体必须和设置富文本时候的字体相同
3、传入的行间距必须和富文本的相同
这里写图片描述
如此一个label既可以设置行距又可以自适应高度,到达UI给出的效果。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值