自定义label计算高度和自适应高度

807 阅读4分钟

闲来无事想着干点啥,在项目中开发可能有时候工期会很紧,想着写一些可以快速开发的东西,好多时间都浪会在写一些无用的代码中,将一些繁琐无用的东西规整,开发中直接调用,将在开发中节省很多时间就想着先重简单的东西开始做起,后续会一点点深入,

######计算label的高度开发中经常会遇到,一般的做法是写标签的分类添加方法或者定义一个类方法封装一个计算高度的方法,在需要的地方调用,我这里为了以后开发的方便,重写了label的方法,根据字的行数和要以宽度和高度为定点来自动计算label的高度并自适应高度,方便了开发中的书写,github代码地址

思想:
1.通过继承label,在内部写一下计算的方法,在内部直接调用,避免了在外部再次调用的麻烦
2.通过封装方法,声明在.h文件中供外界调用,自定义一些属性设置,方法内部处理

//下面是内部方法

- (instancetype)initWithFrame:(CGRect)frame withType:(origionFit)fit{
    if (self = [super initWithFrame:frame]) {
        _type = fit;
        self.backgroundColor = [UIColor redColor];
        self.userInteractionEnabled = YES;
        UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(DoSomeThing)];
        tap.numberOfTapsRequired = 1;
        [self addGestureRecognizer:tap];
    }
    return self;
}


- (void)setdefaultProperty{
    
    if (self.numberOfLines >= 1) {
        self.height = [self singleLineHeightSpacing:defaultSpace lineNumber:self.numberOfLines marginX:defaultMargion];
    }
}

-(void)setNumberOfLines:(NSInteger)numberOfLines
{
    [super setNumberOfLines:numberOfLines];
    //根据设置行数来获取高度
    if (numberOfLines >= 1) {
        self.height = [self singleLineHeightSpacing:defaultSpace lineNumber:numberOfLines marginX:defaultMargion];
    }
}

- (void)DoSomeThing{
    
    if (_Block) {
        _Block(self);
    }
    
    if ([_delegate respondsToSelector:@selector(ClickLabel:)]) {
        [_delegate ClickLabel:self];
    }
}

-(void)setText:(NSString *)text
{
    [super setText:text];
    [self setFrame];
}

- (void)setFrame{
    if (_type == FitWidth) {
        self.height =  [self getLabelSpaceWithlineSpacing:defaultSpace margionX:defaultMargion];
    }else
    {
        CGFloat width = [self getLabelSpaceWithlineSpacing:defaultSpace margionX:defaultMargion];
        if (width > [UIScreen mainScreen].bounds.size.width) {
            //            self.lineBreakMode = NSLineBreakByTruncatingTail;
            self.width = [UIScreen mainScreen].bounds.size.width;
        }
    }
    [self setdefaultProperty];
}


/**
 获取label的高度
 @param space 行间距
 @param X 字间距
 @return 返回label的height
 */
-(CGFloat)getLabelSpaceWithlineSpacing:(CGFloat)space  margionX:(CGFloat)X{
    
    NSMutableParagraphStyle *paraStyle = [[NSMutableParagraphStyle alloc] init];
    if (self.numberOfLines >= 1 ) {
       paraStyle.lineBreakMode = NSLineBreakByTruncatingTail;
    }else
    {
       paraStyle.lineBreakMode = NSLineBreakByWordWrapping; 
    }
    paraStyle.alignment = NSTextAlignmentJustified;
    
//    if (self.numberOfLines > 0) {
        paraStyle.lineSpacing = space; //设置行间距
    paraStyle.paragraphSpacing = X; //设置字间距
    paraStyle.hyphenationFactor = 1.0;
    
    paraStyle.firstLineHeadIndent = 0.0;
    
    paraStyle.paragraphSpacingBefore = 0.0;
    
    paraStyle.headIndent = 0;
    
    paraStyle.tailIndent = 0;
    
    //设置字间距 NSKernAttributeName:@1.5f
    NSDictionary *dic = @{NSFontAttributeName:self.font, NSParagraphStyleAttributeName:paraStyle, NSKernAttributeName:[NSNumber numberWithFloat:X]
                          };
    NSAttributedString *attributeStr = [[NSAttributedString alloc] initWithString:self.text attributes:dic];
    self.attributedText = attributeStr;
    
    if (_type == FitWidth) {
        CGSize size = [self.text boundingRectWithSize:CGSizeMake(self.width, MAXFLOAT) options:NSStringDrawingUsesLineFragmentOrigin attributes:dic context:nil].size;
        
        return size.height;
    }else
    {
        CGSize size = [self.text boundingRectWithSize:CGSizeMake(MAXFLOAT,self.height) options:NSStringDrawingUsesLineFragmentOrigin attributes:dic context:nil].size;
        CGSize OneSize =[@"汉字" sizeWithAttributes:@{NSFontAttributeName:self.font}];
        self.height = OneSize.height - 1;
        return size.width;
    }
}


/**
 获取指定行高度

 @param space 行间距
 @param line 行数
 @param X 字间距
 @return 返回指定行高度
 */
- (CGFloat)singleLineHeightSpacing:(CGFloat)space lineNumber:(NSUInteger)line marginX:(CGFloat)X{
    NSMutableParagraphStyle *paraStyle = [[NSMutableParagraphStyle alloc] init];
    
    NSLog(@"%ld",self.numberOfLines);
    
    if (self.numberOfLines >= 1 ) {
        paraStyle.lineBreakMode = NSLineBreakByTruncatingTail;
    }else
    {
        paraStyle.lineBreakMode = NSLineBreakByWordWrapping;
    }
    
    paraStyle.alignment = NSTextAlignmentJustified;
    
    //    if (self.numberOfLines > 0) {
    paraStyle.lineSpacing = space; //设置行间距
    paraStyle.paragraphSpacing = X; //设置字间距
    paraStyle.hyphenationFactor = 1.0;
    
    paraStyle.firstLineHeadIndent = 0.0;
    
    paraStyle.paragraphSpacingBefore = 0.0;
    
    paraStyle.headIndent = 0;
    
    paraStyle.tailIndent = 0;
    
    //设置字间距 NSKernAttributeName:@1.5f
    NSDictionary *dic = @{NSFontAttributeName:self.font, NSParagraphStyleAttributeName:paraStyle, NSKernAttributeName:[NSNumber numberWithFloat:X]
                          };
    CGSize OneSize = [self.text boundingRectWithSize:CGSizeMake(self.width, MAXFLOAT) options:NSStringDrawingUsesLineFragmentOrigin attributes:dic context:nil].size;
    CGFloat height = 0;
    if (line > 0) {
        height = OneSize.height * line ;
    }
    
    return height;
}



/**
 外部设置行间距
 @param space 行间距
 @param X 字间距
 */
-(void)setLabelSpace:(CGFloat)space  margionX:(CGFloat)X{
    
    NSMutableParagraphStyle *paraStyle = [[NSMutableParagraphStyle alloc] init];
    
    NSLog(@"%ld",self.numberOfLines);
    
    if (self.numberOfLines >= 1 ) {
        paraStyle.lineBreakMode = NSLineBreakByTruncatingTail;
    }else
    {
        paraStyle.lineBreakMode = NSLineBreakByWordWrapping;
    }
    
    paraStyle.alignment = NSTextAlignmentJustified;
    paraStyle.lineSpacing = space; //设置行间距
    paraStyle.paragraphSpacing = X; //设置字间距
    paraStyle.hyphenationFactor = 1.0;
    
    paraStyle.firstLineHeadIndent = 0.0;
    
    paraStyle.paragraphSpacingBefore = 0.0;
    
    paraStyle.headIndent = 0;
    
    paraStyle.tailIndent = 0;
    
    //设置字间距 NSKernAttributeName:@1.5f
    NSDictionary *dic = @{NSFontAttributeName:self.font, NSParagraphStyleAttributeName:paraStyle, NSKernAttributeName:[NSNumber numberWithFloat:X]
                          };
    NSAttributedString *attributeStr = [[NSAttributedString alloc] initWithString:self.text attributes:dic];
    
    self.attributedText = attributeStr;
    
    if (_type == FitWidth) {
        CGSize size = [self.text boundingRectWithSize:CGSizeMake(self.width, MAXFLOAT) options:NSStringDrawingUsesLineFragmentOrigin attributes:dic context:nil].size;
        self.height = size.height;
    }else
    {
        CGSize size = [self.text boundingRectWithSize:CGSizeMake(MAXFLOAT,self.height) options:NSStringDrawingUsesLineFragmentOrigin attributes:dic context:nil].size;
        CGSize OneSize =[@"汉字" sizeWithAttributes:@{NSFontAttributeName:self.font}];
        self.height = OneSize.height - 1;
        self.height = size.width;
    }
    
    if (self.numberOfLines >= 1) {
        self.height = [self singleLineHeightSpacing:space lineNumber:self.numberOfLines marginX:X];
    }
}

/**
 设置同一label不同字体颜色
 
 @param FrontRange 指定部分字体
 @param Frontcolor 指定部分颜色
 */
- (void)setFrontText:(NSRange)FrontRange FontTextColor:(UIColor *)Frontcolor{
    
    NSMutableAttributedString *str = [[NSMutableAttributedString alloc] initWithString:self.text];
    if (FrontRange.location + FrontRange.length <= self.text.length)  {
    [str addAttribute:NSForegroundColorAttributeName value:Frontcolor range:FrontRange];
    }else
    {
        NSLog(@"超出字符串长度");
    }
    self.attributedText = str;
 
}

###调用方法集

!!!!!!!!!如果要设置label的字体的大小和numberOfLines要在设置text之前设置,自己设置行间距和字间距要在设置text之后

 C_Label *Tlabel = [[C_Label alloc]initWithFrame:CGRectMake(0, 200, 300, 100) withType:FitHeight];
    Tlabel.font = [UIFont systemFontOfSize:10];
    Tlabel.numberOfLines = 1;
    Tlabel.text = @"这擅自这是才这 ==== Tlabel";
    [Tlabel setContentMode:UIViewContentModeTop];
    Tlabel.textColor = [UIColor blackColor];
        [Tlabel setLabelSpace:3 margionX:1];
    [self.view addSubview:Tlabel];
    
    
    
    
    C_Label *Blabel = [[C_Label alloc]initWithFrame:CGRectMake(0, 300, 300, 100) withType:FitWidth];
    Blabel.font = [UIFont systemFontOfSize:10];
    Blabel.numberOfLines = 2;
    Blabel.text = @"Blabel===这擅自这是才这是这擅自这是才这是这擅自这是才这是这擅自这是才这是这擅自这是才这是这擅自这是才这是这擅自这是才这是这擅自这是才这是";
    [Blabel setContentMode:UIViewContentModeTop];
    Blabel.textColor = [UIColor blackColor];
//        [Blabel setLabelSpace:10 margionX:1.5];
    [self.view addSubview:Blabel];
    
    
    
    
    C_Label *Clabel = [[C_Label alloc]initWithFrame:CGRectMake(0, 400, 300, 100) withType:FitWidth];
    Clabel.font = [UIFont systemFontOfSize:10];
    Clabel.numberOfLines = 0;
    Clabel.text = @"这擅自这是才这是才能擅自这是才这这擅自这是才这是才能擅自这是才这这擅自这是才这是才能擅自这是才这这擅自这是才这是才能擅自这是才这 ====Clabel";
    [Clabel setContentMode:UIViewContentModeTop];
    Clabel.textColor = [UIColor blackColor];
    [Clabel setLabelSpace:15 margionX:4];
    [self.view addSubview:Clabel];
    
    
    
    C_Label *Xlabel = [[C_Label alloc]initWithFrame:CGRectMake(0, 500, 300, 100) withType:FitHeight];
    Xlabel.font = [UIFont systemFontOfSize:10];
    Xlabel.numberOfLines = 0;
    Xlabel.text = @"Xlabel===这擅自这是才这是才能擅自这是才这这擅自这是才这是才能这擅自这是才这是才能擅自这是才这这擅自这是才这是才能";
    [Xlabel setContentMode:UIViewContentModeTop];
    Xlabel.textColor = [UIColor blackColor];
        [Xlabel setLabelSpace:3 margionX:1];
    [self.view addSubview:Xlabel];
    NSLog(@"***********");

//相对应label的效果图 这里写图片描述