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

原创 2018年04月17日 11:33:15

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;

swift UILabel 文字调整行间距 的方法

let str_ss = "请认真填写银行帐户信息,如果填写不正确,将会影响到您的资金到帐时间,一旦填写不能随意变更,如需变更需提交申请,客服人员会在7个工作日内完成审核."         le...
  • jemlee2002
  • jemlee2002
  • 2016-09-29 21:27:01
  • 2221

[iOS]修改UILabel的行间距/段间距/缩进

[iOS]修改UILabel的行间距/段间距/缩进 - (void)viewDidLoad { [super viewDidLoad]; UILabel *dLabe...
  • u012881779
  • u012881779
  • 2016-04-29 16:23:05
  • 7298

iOS UIlabel文字排版(改变字间距行间距)分类

在iOS开发中经常会用到UIlabel来展示一些文字性的内容,但是默认的文字排版会觉得有些挤,为了更美观也更易于阅读我们可以通过某些方法将UIlabel的行间距和字间距按照需要调节。 比如一个Lab...
  • yusirxiaer
  • yusirxiaer
  • 2016-11-10 17:51:37
  • 1091

关于设置UILabel的文本缩进

在写新浪微博的时候,由于被转发微博的昵称和正文内容是在同一行,所以将显示昵称和正文的两个UILabel重叠在一起了,然后正文的UILabel按照昵称UILabel的尺寸进行缩进,保证正文内容不被遮挡。...
  • carmelo2243
  • carmelo2243
  • 2015-11-21 19:40:53
  • 1057

iOS 当UILabel多行时,改变文本的行间距

UILabel *MessageDetailLabel=[[UILabel alloc]initWithFrame:CGRectMake(0, 100, 320, 100)];     M...
  • Dlg1992
  • Dlg1992
  • 2015-12-24 10:14:19
  • 1912

自定义UILabel设置行距和字间距的各种方法

1,单纯调节行间距的方法、能够调整行间距,但是不能调整字间距     UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(0, 20...
  • Allen_iOS
  • Allen_iOS
  • 2015-03-04 12:09:35
  • 3896

iOS UILabel设置行间距和字间距并计算高度

#define UILABEL_LINE_SPACE 6 #define HEIGHT [ [ UIScreen mainScreen ] bounds ].size.height ...
  • luco2008
  • luco2008
  • 2016-03-25 10:52:52
  • 30285

Swift - 设置UILabel、UITextView的文字行间距

有时我们需要调整 label 或 textView 的文本行间距大小,但这两个组件都没有相关属性可以直接设置。这个就需要借助富文本(NSAttributedString)来实现。 一、设置UILab...
  • mo_xiao_mo
  • mo_xiao_mo
  • 2017-03-09 09:13:46
  • 537

iOS - UILabel设置行间距及文字居中

// 调整行间距 NSMutableAttributedString *attributedString = [[NSMutableAttributedString alloc] initWithSt...
  • lincsdnnet
  • lincsdnnet
  • 2017-02-28 13:30:49
  • 1744

iOS UILabel显示文字设置不同的颜色以及行间距

在项目开发过程中有时候会用到一段介绍文字需要不同的颜色以及行间距,下面的代码就可以实现,供大家参考 NSString *wordStr = [NSString stringWithFormat:@"...
  • YJLiOS
  • YJLiOS
  • 2017-10-27 09:28:54
  • 280
收藏助手
不良信息举报
您举报文章:设置UILabel的行间距与文字缩进
举报原因:
原因补充:

(最多只允许输入30个字)