iOS 富文本經常使用封裝(NSAttributedString淺析)

最近常常遇到關於富文本的一些需求,特此封裝了幾個最經常使用的API分享給你們,但授之以魚不如授之以漁,接下來會順便談談NSAttributedString,確保你讀了本篇文章可以本身封裝關於富文本的API,本文封裝API的示例Demo再此,拿去用吧!騷年們!git

1、經常使用需求封裝

  • 需求:在咱們平常開發中,某些句子中會有改變某些字顏色的需求,固然顏色通常而言就是爲了着重強調,常爲同一種顏色,因此下面代碼是單純改變一句話中的某些字的顏色
/** * 單純改變一句話中的某些字的顏色 * * @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綜合效果圖以下github

2、談談NSAttributedString

一、初始化方法

- (instancetype)initWithString:(NSString *)str;
- (instancetype)initWithString:(NSString *)str attributes:(nullable NSDictionary<NSString *, id> *)attrs;
- (instancetype)initWithAttributedString:(NSAttributedString *)attrStr;複製代碼
  • 第一種使用字符串初始化初始化富文本
  • 第二種使用字符串及屬性字典(就是配置富文本的相關屬性)初始化富文本
  • 第三種就是用其餘富文本初始化富文本

二、經常使用操做API

  • 爲某一範圍內文字添加某個屬性
- (void)addAttribute:(NSString *)name value:(id)value range:(NSRange)range;複製代碼

示例:api

  • 爲某一範圍內文字添加多個屬性(兩個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;複製代碼

三、相關可設置屬性對照

經過API咱們能夠知道,對於富文原本說添加單個屬性和添加屬性字典稱爲其核心方法,就是一個key對應一個Value,只要能瞭解各類屬性所對應效果就能夠隨意組合,搞出適合各類需求的封裝API。app

  • 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水平

3、示例Demo講解

Demo在此,點擊可跳轉字體

  • API路徑地址以下:
/YiDing/Class/Helpers/LSCoreToolCenter複製代碼

截圖以下:ui

  • 使用示例路徑以下:
/YiDing/Class/Sections/LSSection/NSMutableAttributedString複製代碼

截圖以下spa

4、更新

7.18晚更新:有童鞋想要能夠將全部相同的子字符串均可以進行操做,因此添加了一個獲取位置數組的方法並封裝在內,效果圖已經更新,感興趣的能夠去Demo查看。3d

本文由做者 王隆帥 編寫,轉載請保留版權網址,感謝您的理解與分享,讓生活變的更美好!code

相關文章
相關標籤/搜索