富文本 所有相同字段range匹配

今天做富文本 要求關鍵字標紅 但是一段文字里有可能關鍵字會重復很多次 用NSString 的rangeOfString就不行了. 于是用了自己寫的小邏輯去實現,代碼如下:

/**
 返回關鍵字標紅的富文本

 @param str 需要轉換的string
 @param fontSize 字號大小
 @param textColor 字體顏色
 @return 關鍵字標紅的富文本
 */
- (NSAttributedString *)attributStringWithString:(NSString *)str fontSize:(CGFloat)fontSize textColor:(UIColor *)textColor{
    NSMutableArray *rangesArr = [NSMutableArray array];
//這里的self.searchTitles我使用的是一個關鍵詞數組   這樣可以檢索多個關鍵字
    for (NSString *key in self.searchTitles) {
        [rangesArr addObject:[self rangeOfSubString:key inString:str]];
    }
    NSMutableAttributedString *attributStrM = [[NSMutableAttributedString alloc] initWithString:str attributes:@{NSFontAttributeName : FONTSIZE(fontSize),NSForegroundColorAttributeName :textColor }];
    //已經獲取到所有的關鍵字range
    for (NSArray *arr in rangesArr) {
        for (NSString *rangeStr in arr) {
            [attributStrM setAttributes:@{NSFontAttributeName : FONTSIZE(fontSize),NSForegroundColorAttributeName :[UIColor redColor] } range:NSRangeFromString(rangeStr)];
        }
    }

    return attributStrM.copy;
}

/**
 返回所有關鍵字所在的range

 @param subStr 要檢索的關鍵字
 @param content 內容
 @return 所有關鍵字所在的range數組  --- range是用字符串保存的  所以使用的時候需要用NSRangeFromString(rangeStr)
 */
- (NSArray *)rangeOfSubString:(NSString *)subStr inString:(NSString *)content {
    //關鍵字本身就比內容長  直接返回空數組
    if (subStr.length > content.length) {
        return [NSMutableArray array];
    }
    
    NSMutableArray *rangeArray = [NSMutableArray array];
    
    NSString *temp;
    
    for (int i = 0; i < content.length-1; i ++) {
        //篩選的字段比剩下的字段還要長  不用再檢索了
        if (subStr.length + i > content.length) {
            break;
        }
        temp = [content substringWithRange:NSMakeRange(i, subStr.length)];
        
        if ([temp isEqualToString:subStr]) {
            
            NSRange range = {i,subStr.length};
            
            [rangeArray addObject:NSStringFromRange(range)];
            
        }
        
    }
    
    return rangeArray;
}

以上 就能返回一個關鍵字標紅的富文本
直接賦值給Label的attributeString即可;

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 發現 關注 消息 iOS 第三方庫、插件、知名博客總結 作者大灰狼的小綿羊哥哥關注 2017.06.26 09:4...
    肇東周閱讀 12,200評論 4 61
  • 念湖位于云南省會澤縣大橋鄉,從縣城出發,汽車沿著崎嶇不平的柏油路前行,翻過一座山就能看到碧波蕩漾的念湖。 ...
    陳世昕閱讀 374評論 0 1
  • 小小的盆子里裝著一個植物的世界。 到這次為止又畫完一個本子。從開始畫畫第一年的現在陸續畫了有三個本子了。打開本子有...
    桃子的小站閱讀 221評論 0 3
  • 話說這天一冷啊,遍地就都是不幸感冒的人……尤其是愛運動的童鞋,誤以為運動了身體素質就能倍兒好= =,誰知道運動“姿...
    硬派健身閱讀 725評論 0 6
  • 安慰一定要打電話,即使不說話聽著也行。
    LiuLinhu605閱讀 191評論 0 0