紫水晶书院•文思飞扬(散文、随笔、杂文、评论、科普、日记……

iOS改变字符串中多个重复字符串的颜色

2019-01-26  本文已影响14人  我是七月
奋斗的七月
需求:做一个新闻类的APP。里面可以进行评论,当@多个人(人名称可以进行充分)进行评论时候,需要把评论的字符串高亮,给一个不同的颜色,

解决方案:先遍历整个字符串找到所有的人名称所在的位置的index,然后通过index将字符串进行替换,最终可以找到人名称所有的index。根据这个index和人名的length,就可以改变人名的颜色。

#pragma mark - 获取这个字符串中的所有xxx的所在的index
+ (NSMutableArray *)getRangeStr:(NSString *)text findText:(NSString *)findText
{
    
    NSMutableArray *arrayRanges = [NSMutableArray arrayWithCapacity:3];
    
    if (findText == nil && [findText isEqualToString:@""])
    {
        
        return nil;
        
    }
    
    NSRange rang = [text rangeOfString:findText]; //获取第一次出现的range
    
    if (rang.location != NSNotFound && rang.length != 0)
    {
        
        [arrayRanges addObject:[NSNumber numberWithInteger:rang.location]];//将第一次的加入到数组中
        
        NSRange rang1 = {0,0};
        
        NSInteger location = 0;
        
        NSInteger length = 0;
        
        for (int i = 0;; I++)
        {
            
            if (0 == i)
            {//去掉这个xxx
                
                location = rang.location + rang.length;
                
                length = text.length - rang.location - rang.length;
                
                rang1 = NSMakeRange(location, length);
                
            }
            else
            {
                
                location = rang1.location + rang1.length;
                
                length = text.length - rang1.location - rang1.length;
                
                rang1 = NSMakeRange(location, length);
                
            }
            
            //在一个range范围内查找另一个字符串的range
            
            rang1 = [text rangeOfString:findText options:NSCaseInsensitiveSearch range:rang1];
            
            if (rang1.location == NSNotFound && rang1.length == 0)
            {
                
                break;
                
            }
            else//添加符合条件的location进数组
                
                [arrayRanges addObject:[NSNumber numberWithInteger:rang1.location]];
            
        }
        
        return arrayRanges;
        
    }
    
    return nil;
    
}

上面这个方法可以找到所有的项目字符串的位置index
/**
 
 改变字符串里面包含的所有相同字符串的的颜色和字号
 @param font 大小
 @param color 颜色
 @param totalString 整个字符串
 @param subArray 需要改变字符串的数组

 */
+ (NSMutableAttributedString *)ls_changeFontAndColor:(UIFont *)font Color:(UIColor *)color TotalString:(NSString *)totalString SubStringArray:(NSArray *)subArray {
    
    NSLog(@"zsp===%@ 777%@",totalString,subArray);
    
    NSArray *result = [subArray valueForKeyPath:@"@distinctUnionOfObjects.self"];
    NSLog(@"result===888%@",result);
    NSMutableAttributedString *attributedStr = [[NSMutableAttributedString alloc] initWithString:totalString];
    for (int index=0; index<result.count; index++) {
        NSString *cstrTemp = result[index];
        NSMutableArray *locationArr = [self getRangeStr:totalString findText:cstrTemp];
        NSLog(@"locationArr====%@",locationArr);
        for (int i=0; i<locationArr.count; i++) {
            NSNumber *location = locationArr[i];
            NSRange rang =NSMakeRange(location.integerValue, cstrTemp.length);
            [attributedStr addAttribute:NSForegroundColorAttributeName value:color range:rang];
            [attributedStr addAttribute:NSFontAttributeName value:font range:rang];
        }
    }
    return attributedStr;
}

最终的效果图如下:


最终效果
上一篇下一篇

猜你喜欢

热点阅读