美文网首页常用技术收集iOS开发杂货铺iOS基础控件
iOS开发小知识之改变UIlabel的行间距和字间距

iOS开发小知识之改变UIlabel的行间距和字间距

作者: 左左4143 | 来源:发表于2016-09-25 22:34 被阅读22747次

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

比如一个Label的默认间距效果是这样:

然后用一个封装起来的Category来调整这部分文字的行间

[UILabel changeLineSpaceForLabel:cell.describeLabel WithSpace:5.0];

调整后的效果是这样的:

其中5.0就是我自定义的文字间距。

这是一个UILabel 的Category,他的内部实现是这样的:

UILabel+ChangeLineSpaceAndWordSpace.h

#import <UIKit/UIKit.h>

@interface UILabel (ChangeLineSpaceAndWordSpace)

/**
 *  改变行间距
 */
+ (void)changeLineSpaceForLabel:(UILabel *)label WithSpace:(float)space;

/**
 *  改变字间距
 */
+ (void)changeWordSpaceForLabel:(UILabel *)label WithSpace:(float)space;

/**
 *  改变行间距和字间距
 */
+ (void)changeSpaceForLabel:(UILabel *)label withLineSpace:(float)lineSpace WordSpace:(float)wordSpace;

@end

UILabel+ChangeLineSpaceAndWordSpace.m

#import "UILabel+ChangeLineSpaceAndWordSpace.h"

@implementation UILabel (ChangeLineSpaceAndWordSpace)

+ (void)changeLineSpaceForLabel:(UILabel *)label WithSpace:(float)space {

    NSString *labelText = label.text;
    NSMutableAttributedString *attributedString = [[NSMutableAttributedString alloc] initWithString:labelText];
    NSMutableParagraphStyle *paragraphStyle = [[NSMutableParagraphStyle alloc] init];
    [paragraphStyle setLineSpacing:space];
    [attributedString addAttribute:NSParagraphStyleAttributeName value:paragraphStyle range:NSMakeRange(0, [labelText length])];
    label.attributedText = attributedString;
    [label sizeToFit];

}

+ (void)changeWordSpaceForLabel:(UILabel *)label WithSpace:(float)space {

    NSString *labelText = label.text;
    NSMutableAttributedString *attributedString = [[NSMutableAttributedString alloc] initWithString:labelText attributes:@{NSKernAttributeName:@(space)}];
    NSMutableParagraphStyle *paragraphStyle = [[NSMutableParagraphStyle alloc] init];
    [attributedString addAttribute:NSParagraphStyleAttributeName value:paragraphStyle range:NSMakeRange(0, [labelText length])];
    label.attributedText = attributedString;
    [label sizeToFit];

}

+ (void)changeSpaceForLabel:(UILabel *)label withLineSpace:(float)lineSpace WordSpace:(float)wordSpace {

    NSString *labelText = label.text;
    NSMutableAttributedString *attributedString = [[NSMutableAttributedString alloc] initWithString:labelText attributes:@{NSKernAttributeName:@(wordSpace)}];
    NSMutableParagraphStyle *paragraphStyle = [[NSMutableParagraphStyle alloc] init];
    [paragraphStyle setLineSpacing:lineSpace];
    [attributedString addAttribute:NSParagraphStyleAttributeName value:paragraphStyle range:NSMakeRange(0, [labelText length])];
    label.attributedText = attributedString;
    [label sizeToFit];

}

@end

根据内部实现也可以自己灵活运用 不一定用Category的方法。

相关文章

网友评论

  • 爱的播放:对于富文本,不妨试一下NudeIn这款开源库,简直不要太好用,甚至都可以取代UILabel来做日常的文字开发了。
    https://github.com/hon-key/Nudeln
  • YimG:666666666
  • BeeMifeng:确实可以改变,不过导致我的字体靠上显示了,而且字体超出了lable的bounds
  • 小小夕舞:方法走了,但是间距并不改变:joy:
    路要自己丶走:我也是呢 , 你解决了么
  • A_1b56:很棒哦!O(∩_∩)O谢谢楼主!
  • 玫瑰花瓣的信笺:有一点想不明白。如果一段文本需要自适应高度,调完间距后,怎么计算这个文本高度呢?这个间距要怎么算呢?
    特别是在表里,一般拿到数据后,就在model里把高度算好了,赋值的时候调整完间距,这俩肯定是有差距的
    重望沐:@玫瑰花瓣的信笺 请问你解决了嘛,遇到了相同的问题
    玫瑰花瓣的信笺:@孤胆走天涯 我们的问题不一样的。
    我的问题出在:将计算Model高度的代码写在了heightForRowAtIndexPath里(在Model里封装个方法计算也可以,不过需要传入对应Model,感觉还是怪怪的)。
    你的问题出在:你计算文本高度的时候没有加入行间距,所以导致你计算出来的高度每行文字比实际高度都要少一个行间距,所以最后会有部分文字显示不出来。也就是说你的计算没有加入行间距,所以计算出来的高度是错误的。
    孤胆走天涯:我现在就出现了这个问提,在原有高度的前提下,增加的间距,一些文字就显示不出来了
  • 对酒当歌的夜:不错,不错,比较棒,我改动一下,可以把这个分类加一个ib什么的,放到全局,
    那么这个label的分类方法可以直接在xib或者sb里面设置了
    左左4143:@对酒当歌的夜 没看懂:joy:
    对酒当歌的夜:@Elephan_z @property (nonatomic, assign) IBInspectable CGFloat cornerRadius;
    比如要给一个View添加圆角就用分类封装,加这个,在放全局就好了,比用xib的kvc强(user defined runtime attributes)
    左左4143:@对酒当歌的夜 还能让Xib使用?
  • 程小曦:楼主试过tableview里面有label需要设置行间距,如果这样处理的话 NSMutableAttributedString
    则需要频繁 alloc/init,会不会隐藏页面流畅度?
    f39f9bcc369f:我也想问这个问题,感觉列表页这么用有点牺牲性能
    798798123:很赞啊!需要做的就是在设置好文字之后,再设置间距信息!
    如果能够在初始化的时候搞定这些就更完美了:+1: :+1: :+1:
    左左4143: @程小曦 这个还没测试过😂
  • __西门吹雪:亲,你有没有发现,设置之后,显示不完全的话没有办法显示...这儿你是怎么解决的?求指导
    Lorne_coder:@Elephan_z paragraphStyle.lineBreakMode = NSLineBreakByTruncatingTail;
    加上这一句就OK了
    左左4143: @__西门吹雪 显示不完全是怎么回事
  • 我不年幼:很好用,但是有一个问题,这个应该只能在加载过数据后才能使用,如果先调整,再加载数据,就会出现错误
    扑腾的蛾子:可以先赋值,隐藏label,设置好间距后,再让label显示。
  • 嘿_黑羊:非常棒~
  • 无夜之星辰:可以,很强势
  • RhythmMaster:可以,很强势

本文标题:iOS开发小知识之改变UIlabel的行间距和字间距

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