最近經常遇到關於富文字的一些需求,特此封裝了幾個最常用的API分享給大家,但授之以魚不如授之以漁,接下來會順便談談NSAttributedString,確保你讀了本篇文章能夠自己封裝關於富文字的API,本文封裝API的示例Demo再此,拿去用吧!騷年們!
一、常用需求封裝
- 需求:在我們日常開發中,某些句子中會有改變某些字顏色的需求,當然顏色一般而言就是為了著重強調,常為同一種顏色,所以下面程式碼是單純改變一句話中的某些字的顏色
/**
* 單純改變一句話中的某些字的顏色
*
* @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;
}複製程式碼
以上幾種API綜合效果圖如下
二、談談NSAttributedString
1、初始化方法
- (instancetype)initWithString:(NSString *)str;
- (instancetype)initWithString:(NSString *)str attributes:(nullable NSDictionary<NSString *, id> *)attrs;
- (instancetype)initWithAttributedString:(NSAttributedString *)attrStr;複製程式碼
- 第一種使用字串初始化初始化富文字
- 第二種使用字串及屬性字典(就是配置富文字的相關屬性)初始化富文字
- 第三種就是用其他富文字初始化富文字
2、常用操作API
- 為某一範圍內文字新增某個屬性
- (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講解
- API路徑地址如下:
/YiDing/Class/Helpers/LSCoreToolCenter複製程式碼
截圖如下:
- 使用示例路徑如下:
/YiDing/Class/Sections/LSSection/NSMutableAttributedString複製程式碼
截圖如下
四、更新
7.18晚更新:有童鞋想要可以將所有相同的子字串都可以進行操作,所以新增了一個獲取位置陣列的方法並封裝在內,效果圖已經更新,感興趣的可以去Demo檢視。
本文由作者 王隆帥 編寫,轉載請保留版權網址,感謝您的理解與分享,讓生活變的更美好!