最近常常遇到关于富文本的一些需求,特此封装了几个最经常使用的API分享给你们,但授之以鱼不如授之以渔,接下来会顺便谈谈NSAttributedString,确保你读了本篇文章可以本身封装关于富文本的API,本文封装API的示例Demo再此,拿去用吧!骚年们!git
/** * 单纯改变一句话中的某些字的颜色 * * @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;
}复制代码
/** * 单纯改变句子的字间距(须要 <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;
}复制代码
/** * 单纯改变段落的行间距 * * @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;
}复制代码
以上几种API综合效果图以下github
- (instancetype)initWithString:(NSString *)str;
- (instancetype)initWithString:(NSString *)str attributes:(nullable NSDictionary<NSString *, id> *)attrs;
- (instancetype)initWithAttributedString:(NSAttributedString *)attrStr;复制代码
- (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;复制代码
示例:数组
- (void)removeAttribute:(NSString *)name range:(NSRange)range;复制代码
- (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;复制代码
经过API咱们能够知道,对于富文原本说添加单个属性和添加属性字典称为其核心方法,就是一个key对应一个Value,只要能了解各类属性所对应效果就能够随意组合,搞出适合各类需求的封装API。app
/YiDing/Class/Helpers/LSCoreToolCenter复制代码
截图以下:ui
/YiDing/Class/Sections/LSSection/NSMutableAttributedString复制代码
截图以下spa
7.18晚更新:有童鞋想要能够将全部相同的子字符串均可以进行操做,因此添加了一个获取位置数组的方法并封装在内,效果图已经更新,感兴趣的能够去Demo查看。3d
本文由做者 王隆帅 编写,转载请保留版权网址,感谢您的理解与分享,让生活变的更美好!code