需求: 拼音输入,要求根据拼音来显示关键字高亮
效果: 先看效果,目前匹配程度不高,模糊化还是很高,还有一些算法需要优化.在这里也希望小伙伴们不惜赐教,也算是提出问题了
对于拼音输入,我的思路是将所有的字符转成拼音,这里用到了一个拼音转换工具类,demo
然后就是调用字符串的- (void)enumerateSubstringsInRange:(NSRange)range options:(NSStringEnumerationOptions)opts usingBlock:(void (^)(NSString * _Nullable substring, NSRange substringRange, NSRange enclosingRange, BOOL *stop))block
的这个方法
根据NSStringEnumerationOptions
不同的取值,我们得到的遍历结果也是不同;让我们来看看他的枚举值
本例中使用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)
,那么初, 春
将都会是高亮,这显然不是我们想要的,所以接下来就是去重了,额....这部分还没想好,回头补上,感兴趣的同学可以试一下
安安