在项目中做搜索会碰到这样一个问题:你输入字母e,会模糊搜索出很多结果,比如“enter”,“empty”等,里面包含字母e,我们很容易就可以实现高亮字母e,但是结果中如果有中文,比如“这”,“者”,他们的拼音也包含字母e,那么怎么做到高亮结果呢?
方法如下(比如输入了搜索字符searchText : e, 其中一个结果是:“到这里来”):
- 首先将搜索字符searchText转拼音(因为输入的可能是中文,这里统一将结果转为大写的拼音字母来判断,不单独判断),
- 将查询的结果进行遍历,取出查询结果的每个字符,取出“到”;
- 将“到”转为拼音“DAO”,判断“DAO”是否包含搜索字符searchText,如果包含,那么“到”高亮,否则不用高亮;或者搜索字符包含了“DAO”,也高亮,否则不高亮(这里看是否有这个需求)
3.将所有判断的结果都依次组装到一个可变富文本字符串retStr中;
代码如下:
/**
@param orgText 搜索得到的结果
@param searchText 搜索输入的问题本
@param font 字体大小
@param orgColor 默认字体颜色
@param highColor 高亮字体颜色
@return 可变字符串
*/
- (NSAttributedString *)generalSearchHighColorTextWithText:(NSString *)orgText
searchText:(NSString *)searchText
font:(UIFont *)font
orgTextColor:(UIColor *)orgColor
highColor:(UIColor *)highColor
{
NSMutableAttributedString *retStr = [[NSMutableAttributedString alloc] init];
NSString *nameItem = nil;
NSString *nameItemPinYi = nil;
NSAttributedString *nameItemAStr = nil;
UIColor *retColor = nil;
NSString *searchT = [searchText fullSpellPinYinName];//fullSpellPinYinName 为中文转拼音的分类方法
for (NSInteger i = 0; i < orgText.length; ++i)
{
nameItem = [orgText substringWithRange:NSMakeRange(i, 1)];
nameItemPinYi = [nameItem fullSpellPinYinName];
if (nameItemPinYi.length > 0)
{
if (nameItemPinYi.length >= searchT.length)
{
if ([nameItemPinYi containsString:searchT])
{
retColor = highColor;
}
else
{
retColor = orgColor;
}
}
else
{
if ([searchT containsString:nameItemPinYi]){
retColor = highColor;
}
else
{
retColor = orgColor;
}
}
}
else
{
retColor = orgColor;
}
//genaralAttributeStringWith 是用文字,字体,颜色生成富文本的分类方法
nameItemAStr = [UILabel genaralAttributeStringWith:nameItem font:font color:retColor];
[retStr appendAttributedString:nameItemAStr];
}
return retStr;
}
总的来说,这里就是讨论中文结果的拼音中含有输入的字符串,该如何高亮这个中文文本。