在开发过程中,不免要遇到这种需求:通过关键词搜索内容,内容包含关键词部分要高亮显示。
代码示例:
//简单示例
//cell的简单实现
//self.model.title 为搜索结果要展示的title内容
//self.keyWord 为搜索关键词
//self.titleLabel 为cell展示title的Label
NSString *str = self.model.title;
NSMutableAttributedString *attributedString = [[NSMutableAttributedString alloc] initWithString:str];
NSMutableParagraphStyle *paragraphStyle = [[NSMutableParagraphStyle alloc] init];
//一:正则匹配
//NSRegularExpressionCaseInsensitive 不区分大小写 具体用法看其枚举值
//匹配完整搜索关键词字符串
NSRegularExpression *regex = [[NSRegularExpression alloc]initWithPattern:[NSString stringWithFormat:@"%@",self.keyWord] options:NSRegularExpressionCaseInsensitive error:nil];
//匹配搜索关键词的每一个字符都会高亮变色 [cd]和cd的区别
//NSRegularExpression *regex = [[NSRegularExpression alloc]initWithPattern:[NSString stringWithFormat:@"[%@]",self.keyWord] options:NSRegularExpressionCaseInsensitive error:nil];
[regex enumerateMatchesInString:str options:NSMatchingReportProgress range:NSMakeRange(0, [str length]) usingBlock:^(NSTextCheckingResult *result, NSMatchingFlags flags, BOOL *stop) {
[attributedString addAttribute:(NSString*)NSForegroundColorAttributeName
value:(id)[UIColor redColor]
range:result.range];
} ];
//二:
/**
* 当前为搜索页面时,如果 title 的长度大于关键字长度,循环取关键字长度的字匹配关键字,相同则变色
*/
// NSString *temp = nil;
// if (str.length >= self.keyWord.length) {
//
// for (int i = 0; i < [str length] - self.keyWord.length + 1 ; i++)
// {
// temp = [str substringWithRange:NSMakeRange(i, self.keyWord.length)];
//
// 区分大小写:用isEqualToString 不区分大小写:用caseInsensitiveCompare
//// if ([temp isEqualToString:self.keyWord]) {
// if ([temp caseInsensitiveCompare:self.keyWord] == NSOrderedSame) {
// // NSRange range = [str rangeOfString:self.keyWord];
// [attributedString1 addAttribute:(NSString*)NSForegroundColorAttributeName
// value:(id)[UIColor redColor]
// range:NSMakeRange(i, self.keyWord.length)];
// }
// }
// }
[attributedString addAttribute:NSParagraphStyleAttributeName value:paragraphStyle range:NSMakeRange(0, str.length)];
[self.titleLabel setAttributedText:attributedString];