美文网首页
iOS关键字搜索-关键字高亮显示

iOS关键字搜索-关键字高亮显示

作者: CoderZNB | 来源:发表于2017-05-12 01:38 被阅读0次

需求: 拼音输入,要求根据拼音来显示关键字高亮

效果: 先看效果,目前匹配程度不高,模糊化还是很高,还有一些算法需要优化.在这里也希望小伙伴们不惜赐教,也算是提出问题了

关键字搜索.gif

对于拼音输入,我的思路是将所有的字符转成拼音,这里用到了一个拼音转换工具类,demo

然后就是调用字符串的- (void)enumerateSubstringsInRange:(NSRange)range options:(NSStringEnumerationOptions)opts usingBlock:(void (^)(NSString * _Nullable substring, NSRange substringRange, NSRange enclosingRange, BOOL *stop))block的这个方法

根据NSStringEnumerationOptions不同的取值,我们得到的遍历结果也是不同;让我们来看看他的枚举值

  • NSStringEnumerationOptions.png

本例中使用NSStringEnumerationByComposedCharacterSequences按字符顺序进行遍历,比如有一段字符串ZNB美眉,那么遍历结果将是Z, N, B, 美, 眉

然后就是使用拼音转换.将上述单个字符转成拼音

HanyuPinyinOutputFormat *formatter =  [[HanyuPinyinOutputFormat alloc] init];
           formatter.caseType = CaseTypeUppercase;
           formatter.vCharType = VCharTypeWithV;
           formatter.toneType = ToneTypeWithoutTone;
           // 讲汉语转成拼音
           NSString *outputPinyin=[[PinyinHelper toHanyuPinyinStringWithNSString:substring withHanyuPinyinOutputFormat:formatter withNSString:@""] lowercaseString];

接下来就是判断关键字中是否包含转换成拼音 ,我们用谓词来做判断

NSPredicate *predicate1 = [NSPredicate predicateWithFormat:@"SELF CONTAINS[cd] %@",outputPinyin];
 BOOL isBeginWithSubKey =  [predicate1 evaluateWithObject:keyWords];
           if ( isBeginWithSubKey) {
               [mutableAttributedStr addAttribute:NSForegroundColorAttributeName value:color range:substringRange];
               [mutableAttributedStr addAttribute:NSFontAttributeName value:font range:substringRange];               
               [mutableArr addObject:substring];
           }

其实到这一步还没有结束,仅仅只是上面的判断条件不能完美的匹配关键字,比如你的关键字是chun 而你的字符串中有初(chu), 春(chun),那么初, 春将都会是高亮,这显然不是我们想要的,所以接下来就是去重了,额....这部分还没想好,回头补上,感兴趣的同学可以试一下

安安


安安

相关文章

网友评论

      本文标题:iOS关键字搜索-关键字高亮显示

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