富文本

富文本的常用封装(NSAttributedString)

最近经常遇到关于富文本的一些需求,特此封装了几个常用的API分享给大家。

一、常用需求封装

需求:在我们日常的开发中,某些句子中会有改变某些字颜色的需求当然颜色一般而言就是为了着重强调,常为同一种颜色,所以下面代码是单纯改变一句话中的某些字的颜色

/*
单纯改变一句话中的某些字的颜色
@param color 需要改变成的颜色
@param tatalStr 总的字符串
@param subArray 需要改变颜色的文字数组

@return 生成的富文本
*/
+ (NSMutableAttributedString *)Is_changeCorlorWithCorlor:(UICorlor *)color TotalString:( NSString *)totalStr SubStringArray:(NSArray *)subArray{
        NSMutableAttributedString *attributedStr = [ [NSMutableAttributedString alloc ] initWithString:totalStr];
        for (NSString *rangeStr in subArray) {
               NSRange range = [totalStr rangeofString:rangeStr options:NSBackwardsSearch];
               [attributedStr adAttribute:NSForegroundColorAttributeName value:color   range:range];

         }
    return attributedStr;
}

需求:需要更改字间距来适应整体UI

/*
单纯改变句子的字间距(需要<coretext coretext.h = "" >)
 @param totalString 需要更改的字符串
 @param space 字间距
@return 生成的富文本

*/
+ (NSMutableAttributedString *)Is_changeSpaceWithTotalString:(NSString *)totalString Space:(CGFloat)space{
     NSMutableAttributedString *attributedStr = [ [ NSMutableAttributedString alloc] initWithString:totalString];
     long number = space;
     CFNumberRed num = CGNumberCreate(kCFAllocatorDefault , kCFNumberSInt8Type, &number);
     [attributedStr addAttribute:(id)kCTKernAttributeName value:(_bridge id)num range:NSMakeRange(0,[attributedStr length)];
      CFRelease(num);
      return  attributedStr;
}</coretext>

需求:需要改变段落的行间距来适应整体UI

/*
单纯的改变段落的行间距
@param totalString  需要更改的字符串
@param lineSpace    行间距
@return 生成的富文本
*/
+(NSMutableAttributedString *)Is_changeLineSpaceWithTotalString:(NSString *)totalString LineSpace:(CGFloat)lineSpace{
     NSMutableAttributedString *attributedStr = [[NSMutableAttributedString alloc] initWithString:totalString];
    NSMutableParagraphStyle *paragraphStyle = [[NSMutableParagraphStyle alloc] init];
    [paragraphStyle setLineSpacing:lineSpace];
    [attributedStr addAttribute:NSParagraphStyleAttributeName value:paragrtaphStyle  range:NSMakeRange(0,[totalString length)];
    return attributedStr;
}

需求:同时更改行间距和字间距

/*
同时更改行间距和字间距
@param totalString  需要改变的字符串
@param lineSpace 行间距
@param textSpace 字间距
@return 生成的富文本
*/
 +(NSMutableAttributeString *)Is_changeLineAndTextSpaceWithTotalString:(NSString *)totalString LineString:(CGFloat)lineSpace textSpace:(CGFloat)textSpace{
    NSMutableAttributedString *attributedStr = [[NSMutableAttributedString alloc] initWithString:totalString];
    NSMutableParagraphStyle * paragraphStyle = [[NSMutableParagraphStyle alloc] init];
    [paragraphStyle setLineSpacing:lineSpace];
    [attributedStr addAttribute:NSParagraphStyleAttributeName value:paragraphStyle range:NSMakeRange(0, [totalString length])];
    long number = textSpace;
    CFNumberRef num = CFNumberCreate(kCFAllocatorDefault,kCFNumberSInt8Type,&number);
    [attributedStr addAttribute:(id)kCTKernAttributeName value:(__bridge id)num range:NSMakeRange(0,[attributedStr length])];
    CFRelease(num);
    return attributedStr;
}

需求:更改某些文字的颜色并修改其字体,突出重点强调

/**
 *  改变某些文字的颜色 并单独设置其字体
 *
 *  @param font        设置的字体
 *  @param color       颜色
 *  @param totalString 总的字符串
 *  @param subArray    想要变色的字符数组
 *
 *  @return 生成的富文本
 */
+ (NSMutableAttributedString *)ls_changeFontAndColor:(UIFont *)font Color:(UIColor *)color TotalString:(NSString *)totalString SubStringArray:(NSArray *)subArray {
    NSMutableAttributedString *attributedStr = [[NSMutableAttributedString alloc] initWithString:totalString];
    for (NSString *rangeStr in subArray) {
        NSRange range = [totalString rangeOfString:rangeStr options:NSBackwardsSearch];
        [attributedStr addAttribute:NSForegroundColorAttributeName value:color range:range];
        [attributedStr addAttribute:NSFontAttributeName value:font range:range];
    }
    return attributedStr;
}

所以以上的几种效果

二,NSAttributedString

1.初始化方法
//使用字符串初始化富文本
- (instancetype)initWithString:(NSString *)str;
//使用字符串及属性字典(就是配置富文本的相关属性)初始化富文本
- (instancetype)initWithString:(NSString*)str attributes:(nullable NSDictionary<nsstring*,id> *)attrs;
//使用其他富文本初始化富文本
- (instancetype)initWithAttributesString:(NSAttributesString *)attrStr;</nsstring *,id>
2.常用操作API

为某一范围内文字添加某个属性

- (void)addAttributed:(NSString*)name value:(id)value range:(NSRange)range;

示例;

NSRange range = [totalString rangeOfString:rangeStr optionsNSBackwardsSearch];
[attributedStr addAttribute:NSForegroundColorAttributeName value:color range:range];
[attributedStr addAttribute:NSFontAttributeName value:font range:range];

移除某范围内的某个属性(可与添加属性API对照。不在示例)

- (void)removeAttribute:(NSString*)name range:(NSRange)range;

其他部分API(见名知意,可与NSString对照不在赘述)

- (void)replaceCharactersInRange:(NSRange)range withAttributedString:(NSAttributedString *)attrString;
- (void)insertAttributedString:(NSAttributedString*)attrString atIndex:(NSUInteger)loc;
- (void)appendAttributedString:(NSAttributedString *)attrString;
- (void)deleteCharactersInRange:(NSRange)range;
- (void)setAttributedString:(NSAttributedString*)attrString;
3.相关可设置属性对照

通过API我们可以知道,对于富文本来说添加单个属性和添加属性字典成为其核心方法,就是一个key对应一个Value值,只要能了解各种属性所对应效果就可以随意组合,搞出适合各种需求的封装API

  • NSFontAttributeName:字体字号
  • value值:UIFont类型
  • NSParagraphStyleAttributeName:段落样式
    value值:NSParagraphStyle类型(其属性如下)
  • lineSpacing 航家居(具体用法可查看上面的设置行间距API)
  • paragraphSpacing 段落间距
  • alignment 对齐方式
  • firstLineHeadIndent 指定段落开始的缩进像素
  • headIndent 跳帧全部文字得到缩进像素
  • NSForegroundColorAttributeName 字体颜色
    value值:UIColor类型
  • NSBackgroundColorAttributeName 背景颜色
    value值:UIColor类型
  • NSOpliquensessAttributeName 字体粗倾斜
    value值:NSNumber类型
  • NSExpansionAttributeName 字体加粗
    value值:NSNumber类型(比例)0就是不变 1增加一倍
  • NSKernAttributeName 字间距
    value值:CGFloat类型
  • NSUnderlineStyleAttributeName 下划线
    value值:1或0
  • NSUnderlineColorAttributeName 下划线颜色
    value值:UIColor类型
  • NSStrikethroughStyleAttributeName 删除线
    value值:1或0
  • NSStrikethroughColorAttributeName 删除线颜色
    value值:UIColor类型
  • NSStrokeColorAttributeName 字体颜色
    value值:UIColor类型
  • NSStrokeWidthAttributeName 字体描边
    value值:CGFloat
  • NSLigatureAttributeName 连笔字
    value值:1或0
  • NSShadowAttributeName 阴影
    value值:NSShawdow类型(下面是其属性)
  • shadowOffset 影子与字符串的偏移量
  • shadowBlurRadius 影子的模糊程度
  • shadowColor 影子的颜色
  • NSTextEffectAttributeName 设置文本特殊效果,目前只有图版印刷效果可用
    value值:NSString类型
  • NSAttachmentAttributeName 设置文本附件
    value值:NSTextAttachment类型(没研究过,可自行百度研究)
  • NSLinkAttributeName 链接
    value值:NSURL (preferred) or NSString类型
  • NSBaselineOffsetAttributeName 基准线偏移
    value值:NSNumber类型
  • NSWritingDirectionAttributeName 文字方向 分别代表不同的文字出现方向
    value值:@[@(1),@(2)]
  • NSVerticalGlyphFormAttributeName 水平或者竖直文本 在iOS没卵用,不支持竖版
    value值:1竖直 0水平

三,示例Demo讲解

API路径地址如下:
/YiDing/Class/Helpers/LSCoreToolCenter
截图如下

使用示例路径如下:
/YiDing/Class/Sections/LSSection/NSMutableAttributedString
截图如下:

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,496评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,407评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,632评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,180评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,198评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,165评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,052评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,910评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,324评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,542评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,711评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,424评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,017评论 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,668评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,823评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,722评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,611评论 2 353

推荐阅读更多精彩内容