你好,歡迎來到IOS教程網

 Ios教程網 >> IOS編程開發 >> IOS開發基礎 >> 富文本常用封裝(NSAttributedString淺析)

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

編輯:IOS開發基礎

QQ截圖20160714123141.jpg

授權轉載,作者:王隆帥

最近經常遇到關於富文本的一些需求,特此封裝了幾個最常用的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

/**
 *  單純改變句子的字間距(需要 )
 *
 *  @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綜合效果圖如下

1471920007290124.png

二、談談NSAttributedString

1、初始化方法

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

第一種使用字符串初始化初始化富文本

第二種使用字符串及屬性字典(就是配置富文本的相關屬性)初始化富文本

第三種就是用其他富文本初始化富文本

2、常用操作API

為某一范圍內文字添加某個屬性

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

示例:

1471920079271624.png

為某一范圍內文字添加多個屬性(兩個API效果與格式一樣)

- (void)addAttributes:(NSDictionary *)attrs range:(NSRange)range;
- (void)setAttributes:(nullable NSDictionary *)attrs range:(NSRange)range;

示例:

1471920098759788.png

移除某范圍內的某個屬性(可與添加屬性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講解

Demo在此,點擊可跳轉

API路徑地址如下:

/YiDing/Class/Helpers/LSCoreToolCenter

截圖如下:

1471920240647190.png

使用示例路徑如下:

/YiDing/Class/Sections/LSSection/NSMutableAttributedString

截圖如下:

1471920243998913.png

四、更新

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

  1. 上一頁:
  2. 下一頁:
蘋果刷機越獄教程| IOS教程問題解答| IOS技巧綜合| IOS7技巧| IOS8教程
Copyright © Ios教程網 All Rights Reserved