美文网首页
Label随文字内容多少高度自适应

Label随文字内容多少高度自适应

作者: 精神薇 | 来源:发表于2018-10-08 16:38 被阅读0次

    1.第一种
    demo

    #pragma mark 给UILabel设置行间距和字间距等属性
    +(NSAttributedString *)setAttributesWithLabel:(UILabel*)label withText:(NSString*)text withFont:(UIFont*)font{
        NSMutableParagraphStyle *paraStyle = [[NSMutableParagraphStyle alloc] init];
        paraStyle.lineBreakMode = NSLineBreakByCharWrapping;
        paraStyle.alignment = NSTextAlignmentCenter;
        paraStyle.lineSpacing = 1; //设置行间距
        paraStyle.hyphenationFactor = 1.0;
        paraStyle.firstLineHeadIndent = 0.0;
        paraStyle.paragraphSpacingBefore = 0.0;
        paraStyle.headIndent = 0;
        paraStyle.tailIndent = 0;
        //设置字间距 NSKernAttributeName:@1.5f
        NSDictionary *dic = @{NSFontAttributeName:font, NSParagraphStyleAttributeName:paraStyle, NSKernAttributeName:@1.5f
                              };
        
        NSAttributedString *attributeStr = [[NSAttributedString alloc] initWithString:text attributes:dic];
        label.attributedText = attributeStr;
        return label.attributedText;
    }
    #pragma mark 文字不同大小
    +(NSAttributedString *)setSpecialAttributesWithLabel:(UILabel*)label withTipLength:(NSInteger)length withText:(NSString*)text withFontTip:(UIFont*)fontTip withFont:(UIFont*)font withColor:(UIColor *)color{
        NSMutableParagraphStyle *paraStyle = [[NSMutableParagraphStyle alloc] init];
        paraStyle.lineBreakMode = NSLineBreakByCharWrapping;
        paraStyle.alignment = NSTextAlignmentCenter;
        paraStyle.lineSpacing = 1; //设置行间距
        paraStyle.hyphenationFactor = 1.0;
        paraStyle.firstLineHeadIndent = 0.0;
        paraStyle.paragraphSpacingBefore = 0.0;
        paraStyle.headIndent = 0;
        paraStyle.tailIndent = 0;
        //设置字间距 NSKernAttributeName:@1.5f
        NSMutableAttributedString* rate = [[NSMutableAttributedString alloc] initWithString:text];
        [rate addAttribute:NSFontAttributeName value:fontTip range:NSMakeRange(0,  length)];
        [rate addAttribute:NSFontAttributeName value:font range:NSMakeRange(length,  text.length-length)];
        [rate addAttribute:NSForegroundColorAttributeName value:color range:NSMakeRange(length,  text.length-length)];
        
        [rate addAttribute:NSParagraphStyleAttributeName value:paraStyle range:NSMakeRange(0,  text.length)];
        [rate addAttribute:NSKernAttributeName value:@1.5f range:NSMakeRange(0,  text.length)];
        label.attributedText = rate;
        return label.attributedText;
    }
    #pragma mark 计算UILabel的高度(先设置属性,再根据返回的NSAttributedString计算高度)
    +(CGFloat)getLabelHeightWithAttributedString:(NSAttributedString*)attributedString withWidth:(CGFloat)width{
        
        CGRect rect = [attributedString boundingRectWithSize:CGSizeMake(width, kScreenHeight) options:NSStringDrawingUsesLineFragmentOrigin context:nil];
        return rect.size.height;
    }
    

    2.第二种:NSString的分类

    /**
     根据字体、行数、行间距和constrainedWidth计算文本占据的size
     **/
    - (CGSize)textSizeWithFont:(UIFont*)font
                 numberOfLines:(NSInteger)numberOfLines
                   lineSpacing:(CGFloat)lineSpacing
              constrainedWidth:(CGFloat)constrainedWidth{
        
        if (self.length == 0) {
            return CGSizeZero;
        }
        CGFloat oneLineHeight = font.lineHeight;
        CGSize textSize = [self boundingRectWithSize:CGSizeMake(constrainedWidth, MAXFLOAT) options:NSStringDrawingUsesLineFragmentOrigin attributes:@{NSFontAttributeName:font} context:nil].size;
        //  行数
        CGFloat rows = textSize.height / oneLineHeight;
        CGFloat realHeight = oneLineHeight;
        // 0 不限制行数,真实高度加上行间距
        if (numberOfLines == 0) {
            if (rows >= 1) {
                realHeight = (rows * oneLineHeight) + (rows - 1) * lineSpacing;
            }
        } else {
            //  行数超过指定行数的时候,限制行数
            if (rows > numberOfLines) {
                rows = numberOfLines;
                    }
            realHeight = (rows * oneLineHeight) + (rows - 1) * lineSpacing;
        }
        //  返回真实的宽高
        return CGSizeMake(constrainedWidth, realHeight);
    }
    
    - (CGSize)textSizeWithFont:(UIFont*)font
                 numberOfLines:(NSInteger)numberOfLines
              constrainedWidth:(CGFloat)constrainedWidth{
        
        if (self.length == 0) {
            return CGSizeZero;
        }
        CGFloat oneLineHeight = font.lineHeight;
        CGSize textSize = [self boundingRectWithSize:CGSizeMake(constrainedWidth, MAXFLOAT) options:NSStringDrawingUsesLineFragmentOrigin attributes:@{NSFontAttributeName:font} context:nil].size;
        //  行数
        CGFloat rows = textSize.height / oneLineHeight;
        CGFloat realHeight = oneLineHeight;
        // 0 不限制行数,真实高度加上行间距
        if (numberOfLines == 0) {
            if (rows >= 1) {
                realHeight = (rows * oneLineHeight) + (rows - 1) ;
            }
        } else {
            //  行数超过指定行数的时候,限制行数
            if (rows > numberOfLines) {
                rows = numberOfLines;
            }
            realHeight = (rows * oneLineHeight) + (rows - 1) ;
        }
        //  返回真实的宽高
        return CGSizeMake(constrainedWidth, realHeight);
    }
    
    /// 计算字符串长度(一行时候)
    - (CGSize)textSizeWithFont:(UIFont*)font
                    limitWidth:(CGFloat)maxWidth {
        CGSize size = [self boundingRectWithSize:CGSizeMake(MAXFLOAT, 36)options:(NSStringDrawingTruncatesLastVisibleLine | NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingUsesFontLeading)  attributes:@{ NSFontAttributeName : font} context:nil].size;
        size.width = size.width > maxWidth ? maxWidth : size.width;
        size.width = ceil(size.width);
        size.height = ceil(size.height);
        return size;
    }
    
    - (CGSize)textSizeWithFont:(UIFont *)font constrainedToSize:(CGSize)size lineBreakMode:(NSLineBreakMode)lineBreakMode {
        CGSize textSize;
        if (CGSizeEqualToSize(size, CGSizeZero)) {
            NSDictionary *attributes = [NSDictionary dictionaryWithObject:font forKey:NSFontAttributeName];
            textSize = [self sizeWithAttributes:attributes];
        } else {
            textSize = [self sizeWithFont:font constrainedToSize:size lineBreakMode:NSLineBreakByCharWrapping];
        }
        return textSize;
    }
    

    相关文章

      网友评论

          本文标题:Label随文字内容多少高度自适应

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