• 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;
        
    }
    

       如果有什么问题可以向我反馈一下,谢谢

      感觉大家阅读。

  • 相关阅读:
    UVA 10305 Ordering Tasks(拓扑排序)
    UVA 1152 4 Values whose Sum is 0(中途相遇法)
    UVA 1103 Ancient Messages
    HDU 2141 Can you find it?
    POJ 2456 Aggressive cows(二分+贪心)
    Tallest Cow【模拟】
    Tallest Cow【模拟】
    激光炸弹【模拟】
    激光炸弹【模拟】
    激光炸弹【模拟】
  • 原文地址:https://www.cnblogs.com/wupei/p/4019963.html
Copyright © 2020-2023  润新知