美文网首页iOS开发富文本
动态调整UILabel高度

动态调整UILabel高度

作者: J_Knight_ | 来源:发表于2016-07-05 18:43 被阅读702次

    需求点:


    有时我们需要根据UILabel内部的字体格式(包括字体大小,行间距)来动态调整UILabel的高度。
    笔者在这里提供了两个方法,可以根据UILabel内部特定的字体,行间距,UILabel宽度来获得UILabel内部的真是高度。

    动态调整Label的高度一共分为三个步骤

    1. 获得具有特定格式的AttributedString。
    2. 根据AttributedString来获得新高度。
    3. 重新设置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高度

    相关文章

      网友评论

      • imzhuzx:3中maxWith 是哪来的
      • WillyGeek:这种方法在iOS 9跟iOS 10还有iOS 8下能够分别准确计算到精确的高度吗
        J_Knight_:太准确的做不到,我不是很清楚,一般都是 +4
      • bf0ac24b98a4:怎么没看懂呢?:cold_sweat:
        J_Knight_:@C_Enheng 好啊~
        bf0ac24b98a4:@J_Knight 谢谢 看懂了
        J_Knight_:@C_Enheng 哪里没看懂?

      本文标题:动态调整UILabel高度

      本文链接:https://www.haomeiwen.com/subject/uxohjttx.html