设置UILabel的行间距与文字缩进

UILabel的行间距设置

UILabel的默认行间距是很小的,所有大部分时候都会要求要有一个行间距。实现起来也很简单,基本都是利用NSMutableParagraphStyle的lineSpacing属性。但是细心的人发现设置完成后并没有达到预期的效果,而是比要求的间距大了一点,这主要是因为UILabel的文字大小(label.font.pointSize)和每行的高度(label.font.lineHeight)并不是重合的,而是有一部分的留白,所以设置行间距的时候要将这部分留白的高度减去才会达到标准的行间距。

UILabel *label = [[UILabel alloc]init];
[self.view addSubview:label];
label.numberOfLines = 0;
label.font = [UIFont systemFontOfSize:14];
label.backgroundColor = [UIColor yellowColor];

NSString *str = @"在中国枸杞有很多民间叫法,如苟起子、枸杞红实、甜菜子、西枸杞、狗奶子、红青椒、枸蹄子、枸杞果、地骨子、枸茄茄、红耳坠、血枸子、枸地芽子、枸杞豆、血杞子、津枸杞。在宁夏枸杞主产区,宁夏省中宁县,农民们习惯称呼枸杞为“茨”,茨即蒺藜。这是由于野生枸杞与蒺藜相似,常被混采作烧柴,在民间把“茨”当作枸杞的俗名叫惯了。在中宁农村,枸杞园称为茨园,拘杞树称为茨树,枸杞枝称为茨条。于是,盛产枸杞的中宁农村又被称为茨乡,富有中宁地方色彩的文化也往往被冠以茨乡的称号,如茨乡戏、茨乡歌谣等。但是,在药材领域里,枸杞即枸杞子,不用茨果,茨实等称谓。";

NSMutableAttributedString *attributeStr =[[NSMutableAttributedString alloc] initWithString:str];

NSMutableParagraphStyle *style = [[NSMutableParagraphStyle alloc] init];

// 设置行间距为 要求的行间距减去每行文字的留白部分
style.lineSpacing = 10 - (label.font.lineHeight - label.font.pointSize);

NSDictionary *dict = @{NSFontAttributeName: [UIFont systemFontOfSize:14], NSParagraphStyleAttributeName: style};

[attributeStr addAttributes:dict range:NSMakeRange(0, attributeStr.length)];

// 计算文字的宽高
CGRect rect = [str boundingRectWithSize:CGSizeMake([UIScreen mainScreen].bounds.size.width-40, CGFLOAT_MAX) options:NSStringDrawingUsesFontLeading | NSStringDrawingUsesLineFragmentOrigin attributes:dict context:nil];

label.frame = CGRectMake(20, 100, ceilf(rect.size.width), ceilf(rect.size.height));
label.attributedText = attributeStr;
label.lineBreakMode = NSLineBreakByTruncatingTail;

UILabel的文字内容缩进

在UILabel的默认属性中是没有实现文字缩进属性的,所以我们要通过UILabel在文字绘制的时候限制他的绘制区域来实现文字缩进

继承UILabel写一个子类ContentInsetsLabel,添加一个缩进的属性contentInsets,然后通过重写UILabel的drawTextInRect方法传入限制后的区域来实现文字缩进

@interface ContentInsetsLabel : UILabel

// 文字上左下右的缩进值
@property (assign, nonatomic) UIEdgeInsets contentInsets;

@end

@implementation ContentInsetsLabel

// 重写方法传入缩进后的区域
- (void)drawTextInRect:(CGRect)rect {
    [super drawTextInRect:UIEdgeInsetsInsetRect(rect, self.contentInsets)];
}

@end

当需要文字缩进的时候直接给contentInsets属性赋值即可实现文字缩进,调用方法如下

ContentInsetsLabel *label = [[ContentInsetsLabel alloc]init];
[self.view addSubview:label];
label.numberOfLines = 0;
label.font = [UIFont systemFontOfSize:14];
label.backgroundColor = [UIColor yellowColor];
label.contentInsets = UIEdgeInsetsMake(10, 10, 10, 10);

NSString *str = @"在中国枸杞有很多民间叫法,如苟起子、枸杞红实、甜菜子、西枸杞、狗奶子、红青椒、枸蹄子、枸杞果、地骨子、枸茄茄、红耳坠、血枸子、枸地芽子、枸杞豆、血杞子、津枸杞。在宁夏枸杞主产区,宁夏省中宁县,农民们习惯称呼枸杞为“茨”,茨即蒺藜。这是由于野生枸杞与蒺藜相似,常被混采作烧柴,在民间把“茨”当作枸杞的俗名叫惯了。在中宁农村,枸杞园称为茨园,拘杞树称为茨树,枸杞枝称为茨条。于是,盛产枸杞的中宁农村又被称为茨乡,富有中宁地方色彩的文化也往往被冠以茨乡的称号,如茨乡戏、茨乡歌谣等。但是,在药材领域里,枸杞即枸杞子,不用茨果,茨实等称谓。";

// 注意:在计算文字高度的时候传入的CGSize是文字缩进之后的最大宽度及高度
CGRect rect = [str boundingRectWithSize:CGSizeMake([UIScreen mainScreen].bounds.size.width-40, CGFLOAT_MAX) options:NSStringDrawingUsesFontLeading | NSStringDrawingUsesLineFragmentOrigin attributes:@{NSFontAttributeName: [UIFont systemFontOfSize:14]} context:nil];

// 注意:计算出来的rect是文字缩进后的自适应宽度和高度 所以在设置文字frame的时候要将设置缩进的边距加回来
label.frame = CGRectMake(10, 250, ceilf(rect.size.width+20), ceilf(rect.size.height+20));

label.text = str;

猜你喜欢

转载自blog.csdn.net/bluecat_1128/article/details/79971777