富文本的常用封装(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
截图如下: