美文网首页
iOS字符串同一字符全部高亮

iOS字符串同一字符全部高亮

作者: 迷了jiang | 来源:发表于2018-10-26 17:00 被阅读31次

前段时间公司的APP有个搜索页面,设计要求搜索结果里面的搜索字符全部高亮,大概是这么个需求。


搜索结果图

思路是这样,首先找到所有要高亮字符的range,然后改变颜色即可。

先看寻找字符所有位置的算法

#pragma mark - 获取这个字符串中的所有搜索字符的所在的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)
            {                
                //去掉这个abc字符串
                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;
}

将目标位置文字替换为设计指定的颜色

    NSString *searchTextLowerStr = searchText.lowercaseString;
    NSMutableAttributedString *mutrString = [[NSMutableAttributedString alloc] initWithString:indexName];
    NSMutableArray *rangeArray = [self getRangeStr:indexLowerStr findText:searchTextLowerStr];
    for (NSNumber *value in rangeArray) {
        NSRange range = NSMakeRange(value.integerValue, searchTextLowerStr.length);
        [mutrString addAttribute:NSForegroundColorAttributeName value:[UIColor colorWithHexString:@""] range:range];
    }

欢迎大家讨论,如果有更好的算法,也可以告诉我。

相关文章

网友评论

      本文标题:iOS字符串同一字符全部高亮

      本文链接:https://www.haomeiwen.com/subject/qtrltqtx.html