iOS中NSAttributedString的使用--對關鍵字着色,以及處理html實例


      1,最近項目中用到了一個功能,一個很好的功能。就是用戶在搜索的時候,搜索結果出來后對你輸入的關鍵字進行紅色標記。這樣用戶就很請楚的看到自己輸入什么后會出現什么樣子的結果。還有一個功能是,現在有一段文字了,但是要對其中的某些字符串進行着色處理,這個時候NSAttibutedString起到了非常大的作用。以下是我寫好的一段代碼,各位可以拿去用,非常方便的處理好。

#import <Foundation/Foundation.h>

@interface NSAttributedString (Color)
/**
 *  對內容中部份關鍵字進行着色處理
 *
 *  @param content 所有內容
 *  @param searchs 關鍵字數組
 *
 *  @return
 */
+(NSAttributedString *)attributeStringWithContent:(NSString *)content keyWords:(NSArray *)keyWords;
@end
+(NSAttributedString *)attributeStringWithContent:(NSString *)content keyWords:(NSArray *)keyWords

{

    UIColor *color=[UIColor redColor];

    NSMutableAttributedString *attString = [[NSMutableAttributedString alloc] initWithString:content];

    if (keyWords) {

        [keyWords enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {

            NSMutableString *tmpString=[NSMutableString stringWithString:content];

            NSRange range=[content rangeOfString:obj];

            NSInteger location=0;

            while (range.length>0) {

                [attString addAttribute:(NSString*)NSForegroundColorAttributeName value:color range:NSMakeRange(location+range.location, range.length)];

                location+=(range.location+range.length);

                NSString *tmp= [tmpString substringWithRange:NSMakeRange(range.location+range.length, content.length-location)];

                tmpString=[NSMutableString stringWithString:tmp];

                range=[tmp rangeOfString:obj];

            }

            

        }];

    }

    

    return attString;

}

 

 

 

 之前也有看到類似的第三方,他是指寫位置,哪個位置到哪個位置的,這里的話是直接指定字符串,而且,出現多次的,一樣可以全部着色。大家可以根據自身需求進行細微的調整。

   2,還有一種情況,當后台返回的內容中帶有html獨有的標簽怎么辦?當然,你可以選擇一些第三方來處理,但是對比你想要的功能后,可以發現,這並不是你想要的,太笨重了,我只是要把html標簽去了,或是就按html里面的格式顯示 。但是又不想用webview去顯示 ,因 為webview不能對這些文本進行編輯。這里我就簡單寫個把html轉成NSAttibutedString的方法。

 

+(NSAttributedString *)attributedStringWithHtml:(NSString *)html
{
    NSDictionary *options = @{NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType};
    NSMutableAttributedString *attrString=[[NSMutableAttributedString alloc] initWithData:[html dataUsingEncoding:NSUnicodeStringEncoding allowLossyConversion:YES] options:options documentAttributes:nil error:nil];
    return attrString;
    
}

   這里返回的是按照原來的html格式,CSS樣式一樣生效的。如果你只想把html標簽去了,而不要顯示成有CSS樣式的,你可以直接在返回的attrString中再調用[attrString string]方法就可以,然后直接顯示在label或者textView在,非常的方便。

  3.這兩天有朋友提到一個需求是,關鍵字和顏色都自定義,最后寫了個方法實現了這個功能。

 

/**
 *  對指定內定進行着色,keywords數組與colors數組相對應
 *
 *  @param content  全部內容
 *  @param keyWords 關鍵字數組
 *  @param color    關鍵字對應顏色,如果傳空,則默認對關鍵字着紅色
 *  @param repeat   關鍵字出現多次的時候,是否全部進行多次着色,默認否
 *
 *  @return 
 */
+(NSAttributedString *)attributeStringWithContent:(NSString *)content keyWords:(NSArray *)keyWords colors:(NSArray *)colors repeat:(BOOL)repeat;

 

+(NSAttributedString *)attributeStringWithContent:(NSString *)content keyWords:(NSArray *)keyWords colors:(NSArray *)colors repeat:(BOOL)repeat
{
    
    NSMutableAttributedString *attString = [[NSMutableAttributedString alloc] initWithString:content];
    if (keyWords) {
        
        [keyWords enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
            NSMutableString *tmpString=[NSMutableString stringWithString:content];
            NSRange range=[content rangeOfString:obj];
            NSInteger location=0;
            while (range.length>0) {
                UIColor *color=nil;
                if (!colors[idx]) {
                    color=[UIColor redColor];
                }else{
                    color=colors[idx];
                }
                [attString addAttribute:(NSString*)NSForegroundColorAttributeName value:color range:NSMakeRange(location+range.location, range.length)];
                location+=(range.location+range.length);
                NSString *tmp= [tmpString substringWithRange:NSMakeRange(range.location+range.length, content.length-location)];
                tmpString=[NSMutableString stringWithString:tmp];
                range=[tmp rangeOfString:obj];
                if (!repeat) {
                    break;
                }
            }
            
        }];
    }
    
    return attString;
    
}

   如果有什么問題可以向我反饋一下,謝謝

  感覺大家閱讀。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM