iOS 搜索结果关键字变色

效果图

未命名.gif

功能

1. 将英文字母当做全拼匹配中文
2. 将英文字母当做拼音首字母匹配中文
3. 中英数字特殊字符混合匹配

Demo

实现思路

近日,需要为App的搜索功能添加快速匹配列表,具体需求如下:

  1. 输入英文字母匹配对应英文
    例如 输入a 匹配到 ask中的a 将a变色
  2. 输入中文匹配中文
  3. 输入英文字母匹配对应中文首字母
    例如输入sk 匹配到 失控 时刻 时空
  4. 输入英文匹配对应中文全拼 (划重点)
    例如输入 ih 可以匹配到 帝豪(dihao) 你好(nihao)
  5. 混合匹配下基本正确(允许出现少许问题)

解决需求

1:直接调用rangeofstring方法得到需要变色区域即可
2:先将双方字符串统一大小后,rangeofstring得到变色区域即可
3:

  • 将源字符串的中文转为拼音

      NSMutableString *pinyin = [chinese mutableCopy];
      CFStringTransform((__bridge CFMutableStringRef)pinyin, NULL, kCFStringTransformMandarinLatin, NO);
      CFStringTransform((__bridge CFMutableStringRef)pinyin, NULL, kCFStringTransformStripCombiningMarks, NO);
    
  • 取得其首字母

    [[pinyin substringWithRange:NSMakeRange(0, 1)] uppercaseString];
    
  • rangeofstring得到变色区域

4:

  • 得到源字符串转换的全拼字符串

    你好,少年      
    nihao,shaonian
    
  • 生成源字符串和全拼字符串的对应关系字典

iOS 搜索结果关键字变色_第1张图片
94001D19-7FC7-4A9A-A68E-BE75663A436B.png

如图得到的字典如下

@{
    0:[0,1],//你  ni
    1:[2,3,4],//好 hao
    2:[5],//
    3:[6,7,8,9],//少 shao
    4:[10,11,12,13] //年
};
  • 获得输入的字母在全拼字符串中的位置 (例如输入为ih)

    [@"nihao,shaonian" rangeOfString:@"ih"];
    根据range得出位置为1,2
    
  • 利用得出的位置匹配上述字典的值

     1 位于 0:[0,1]中 则得到对应源字符串位置 --> 0(你)
     2 位于 1:[2,3,4]中 则得到对应源字符串位置 --> 1(好)
     生成源字符串对应的range
    
  • 利用得出的源字符串的range变色即可

5:因为在需求4的解决方案中对应的特殊字符也写入了全拼字符串,则已经可以解决此需求

其中遭遇的坑

  • CFStringTransform得到中文的拼音
    你会发现"沈沈"被识别为“chenchen”
    ”女“被识别为”nu“,这个是因为其转为的拼音带了声调符,在去掉声调符的时

    iOS 搜索结果关键字变色_第2张图片
    E5AB04DB-47DD-4A84-820F-DA8EE6667642.png

    上的两点也被去掉了 所以就变成了u,所以这个bug运用系统的转换是无法解决的,只能等待系统更新

  • 直接使用3的时候会出现 如果文本为“的到都”,搜索文字为“都”时,会将“的到都”都匹配到,因为运用了首字母匹配,所有在搜索文字仅仅为中文时,不能启用首字母匹配,混合的时候出现此种情况暂时无法避免。

你可能感兴趣的:(iOS 搜索结果关键字变色)