您的位置:首页 > 其它

NSAttributedString富文本简单介绍和常用方法浅析

2016-07-25 11:29 316 查看

NSAttributedString基本知识点介绍

1、初始化方法

- (instancetype)initWithString:(NSString *)str;
- (instancetype)initWithString:(NSString *)str attributes:(nullable
NSDictionary<NSString *, id> *)attrs;
- (instancetype)initWithAttributedString:(NSAttributedString *)attrStr;


第一种使用字符串初始化初始化富文本
第二种使用字符串及属性字典(就是配置富文本的相关属性)初始化富文本
第三种就是用其他富文本初始化富文本

2、常用操作

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

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


为某一范围内文字添加多个属性(两个API效果与格式一样)

- (void)addAttributes:(NSDictionary<NSString *, id> *)attrs range:(NSRange)range;

- (void)setAttributes:(nullable NSDictionary<NSString *, id> *)attrs
range:(NSRange)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类型
NSObliquenessAttributeName 字体粗倾斜

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讲解:

case 1:

{

//单纯改变几个字的颜色样式

_textLabel.attributedText = [AttributedStringTool ls_changeCorlorWithColor:[UIColor redColor] TotalString:@"生活如酒,或芳香,或浓烈,因为诚实,它变得醇厚;生活如歌,或高昂,或低沉,因为守信,它变得悦耳; 生活如画,或明丽,或素雅,因为诚信,它变得美丽。" SubStringArray:@[@"生活",@"或",@"因为"]];

}

break;

case 2:

{

//单纯改变字间距样式

_textLabel.attributedText = [AttributedStringTool ls_changeSpaceWithTotalString:@"用心聆听,深深呼吸,烟花雨,梨花月,寄一缕风的香魂,远离喧嚣。" Space:10.0];

}

break;

case 3:

{

//单纯改变行间距样式

_textLabel.attributedText = [AttributedStringTool ls_changeLineSpaceWithTotalString:@"一些过去,记住就好;一些回忆,收好安放,流年清浅,我只愿面朝大海春暖花开。" LineSpace:12.0];

}

break;

case 4:

{

//改变某些字颜色,并单独设置其字体大小

_textLabel.attributedText = [AttributedStringTool ls_changeFontAndColor:[UIFont systemFontOfSize:20] Color:[UIColor redColor] TotalString:@"微风乍起,迎来层层涟漪,然后又恢复最初的平静。看着荷叶下的净水,心也跟着平静。暂时会忘掉一切骚动不安,就像涟漪过后终归平静一样。" SubStringArray:@[@"平静",@"涟漪",@"微风"]];

}

break;

case 5:

{

//同时改变行间距和字间距 行间距10,字间距5

_textLabel.attributedText = [AttributedStringTool ls_changeLineAndTextSpaceWithTotalString:@"静静的,学会了一颗心去聆听,去欣赏。就如同那一湖秋水,淡淡的几许波纹,却能承载千年的日月,揽尽万里的浮云。" LineSpace:10.0 textSpace:5.0];

}

break;

case 6:

{

//将文字改为链接形式

_textLabel.attributedText = [AttributedStringTool ls_addLinkWithTotalString:@"百度www.baidu.com" SubStringArray:@[@"百度www.baidu.com"]];

}

break;

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

/**
*  单纯改变一句话中的某些字的颜色
*
*  @param color    需要改变成的颜色
*  @param totalStr 总的字符串
*  @param subArray 需要改变颜色的文字数组
*
*  @return 生成的富文本
*/
+ (NSMutableAttributedString *)ls_changeCorlorWithColor:(UIColor *)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 addAttribute:NSForegroundColorAttributeName value:color range:range];
}

return attributedStr;
}


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

/**
*  单纯改变句子的字间距(需要 <CoreText/CoreText.h>)
*
*  @param totalString 需要更改的字符串
*  @param space       字间距
*
*  @return 生成的富文本
*/
+ (NSMutableAttributedString *)ls_changeSpaceWithTotalString:(NSString *)totalString Space:(CGFloat)space {

NSMutableAttributedString *attributedStr = [[NSMutableAttributedString alloc] initWithString:totalString];
long number = space;
CFNumberRef num = CFNumberCreate(kCFAllocatorDefault,kCFNumberSInt8Type,&number);
[attributedStr addAttribute:(id)kCTKernAttributeName value:(__bridge id)num range:NSMakeRange(0,[attributedStr length])];
CFRelease(num);

return attributedStr;
}


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

/**
*  单纯改变段落的行间距
*
*  @param totalString 需要更改的字符串
*  @param lineSpace   行间距
*
*  @return 生成的富文本
*/
+ (NSMutableAttributedString *)ls_changeLineSpaceWithTotalString:(NSString *)totalString LineSpace:(CGFloat)lineSpace {

NSMutableAttributedString *attributedStr = [[NSMutableAttributedString alloc] initWithString:totalString];

NSMutableParagraphStyle * paragraphStyle = [[NSMutableParagraphStyle alloc] init];
[paragraphStyle setLineSpacing:lineSpace];

[attributedStr addAttribute:NSParagraphStyleAttributeName value:paragraphStyle range:NSMakeRange(0, [totalString length])];

return attributedStr;
}


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

/**
*  同时更改行间距和字间距
*
*  @param totalString 需要改变的字符串
*  @param lineSpace   行间距
*  @param textSpace   字间距
*
*  @return 生成的富文本
*/
+ (NSMutableAttributedString *)ls_changeLineAndTextSpaceWithTotalString:(NSString *)totalString LineSpace:(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;
}

效果图:







源码下载:http://download.csdn.net/detail/hbblzjy/9585735
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: