根据公司要求
老大分配我任务 实现应用中搜索结果实现关键词高亮效果,最初以为很好做,因为之前根据网上资料模仿写了个之定义UILabel 确实很快就实现了,提交给测试的 测试。真心佩服测试人员啊。各种bug偷偷溜走 然后被他们逮到 。最后的结果无法显示系统表情。后来才醒觉。那个自定义UILabel 最后形成一张图片 对表情就文法显示出来了。所以我蛋疼了。 没办法任务就是任务,我就问老大这该怎么做啊,一句让我懂了 这就是你进步的机会了。好吧
默默的找资料。坑爹啊 没有既然。收到就是Android的。以前很喜欢前端 在大学时做的也是前端 最近在研究WORDPRESS后来我突然想到了UIWebView 控件来实现。
首先说说的实现吧。通过搜索能得到搜索的关键字符串 (keyStr) 通过keyStr搜索得到返回结果array;其中array中有相关搜索结果对象,展现到tableview中去入下图
关键要实现不同效果。
1.将关键字符串截取为单个字符 保存在一个数组中 相同的就不加入array1;
2,将返回结果同样截取为单个保存在一个数组中 都保存array2;
3,拼接HTML :用array2对象和单个和array1中所有对象比较是否相同,如果相同就拼接为
<font color=red>%@</font>添加 一个字符串中 如果不相同就直接添加一个字符串后面 最后就得到我们要的HTML 字符串了;
4。为了解决uiwebview中一个显示问题 文字在uiwebview 会里空间(0,0)有一段距离很难看并且不好计算后面的空间自适应宽度。所以在这段HTML字符串中又嵌套了
<p style=\"margin-top:-10px;margin-left:-7px; padding:0\" >%@</p> 用于解决 间距问题。
5.最后一定会很焦虑的是 我点击tableview中的CELL 时候 会出现一块白色的矩形 这就是WebView 位置大小 没有根cell一起改变颜色。期初我 也纳闷啊,webview我背景都设置为透明的了。 后来网上找了好久为什么呢?一个小小帖子就那么短短的不起眼的一个属性,解决我致命的问题
[_userNameSearchView setOpaque:NO]; (透明了就这样)。
下面附上代码 能力有限我知道很丑
控制器的代码:
//是否开启电话号码、昵称等搜索功能
- (BOOL)isOpenMoreModeSearchFunction
{
return YES;//此搜素开关暂时不用,搜索功能确定打开 added by zhoukai 2014-11-17
}
//判断是不是小写字母
- (BOOL)isLowerLetter:(NSString *)str
{
if ([str characterAtIndex:0] >= 'a' && [str characterAtIndex:0] <= 'z') {
return YES;
}
return NO;
}
//判断是不是大写字母
- (BOOL)isCatipalLetter:(NSString *)str
{
if ([str characterAtIndex:0] >= 'A' && [str characterAtIndex:0] <= 'Z') {
return YES;
}
return NO;
}
//将搜索得到的结果变为一个个字符 组成数组
- (NSMutableArray *)strChangeArray:(NSString *)contentStr
{
NSString *tempStr = [NSString stringWithFormat:@"%@",contentStr];
NSMutableArray *tempArry = [NSMutableArray array];
for (int i = 0; i < contentStr.length; i++) {
NSString *str = [NSString stringWithFormat:@"%@",[tempStr substringWithRange:NSMakeRange(0, 1)]];
[tempArry addObject:str];
tempStr = [tempStr substringFromIndex:1];
}
return tempArry;
}
//根据关键字数组 拼接HTML 字符串
- (NSString *)stringChangeHtmlByArray:(NSArray *)array withString:(NSString *)str
{
NSString *htmlStr = nil;
BOOL firstTag = YES;
for (NSString *keyStr in [self strChangeArray:str]) {
if ([array containsObject:keyStr]) {
if (firstTag) {
firstTag = NO;
htmlStr = [NSString stringWithFormat:kTitleStringHtml,keyStr];
} else {
htmlStr = [htmlStr stringByAppendingString:[NSString stringWithFormat:kTitleStringHtml,keyStr]];
}
} else {
if (firstTag) {
firstTag = NO;
htmlStr = keyStr;
} else {
htmlStr = [htmlStr stringByAppendingString:[NSString stringWithFormat:@"%@",keyStr]];
}
}
}
return htmlStr;
}
这是cell 中的代码
//检查是否和数组数据重复 如果不相同加入数组
- (void)isJoinKeyArray:(NSString *)string
{
if (![keyArray containsObject:string]) {
[keyArray addObject:string];
}
}
//将关键字符串 变为关键字符数组
- (void)keysChangeKeyArray:(NSString *)keyStr
{
[keyArray removeAllObjects];
NSString *tempStr = [NSString stringWithFormat:@"%@",keyStr];
for (int i = 0; i < keyStr.length; i++) {
NSString *str = [NSString stringWithFormat:@"%@",[tempStr substringWithRange:NSMakeRange(0, 1)]];
//小写
if ([GET_SINGLETON_FOR_CLASS(SearchManager) isLowerLetter:str]) {
[self isJoinKeyArray:str.uppercaseString];
}
//大写
if ([GET_SINGLETON_FOR_CLASS(SearchManager) isCatipalLetter:str]) {
[self isJoinKeyArray:str.lowercaseString];
}
[self isJoinKeyArray:str];
tempStr = [tempStr substringFromIndex:1];
}
}
//要显示的地方
_userNameSearchView = [[UIWebView alloc]init];
[_userNameSearchView.scrollView setShowsVerticalScrollIndicator:NO];
[_userNameSearchView.scrollView setShowsHorizontalScrollIndicator:NO];
[_userNameSearchView.scrollView setScrollEnabled:NO];
_userNameSearchView.backgroundColor = [UIColor clearColor];
_userNameSearchView.scrollView.backgroundColor = [UIColor clearColor];
_userNameSearchView.userInteractionEnabled = NO;
[_userNameSearchView setOpaque:NO];
[self.contentView addSubview:_userNameSearchView];
NSString *htmlStr = [GET_SINGLETON_FOR_CLASS(SearchManager) stringChangeHtmlByArray:keyArray withString:chatRoomInfo.roomName];
NSString *htmlStrP = [NSString stringWithFormat:kTitleStringHtmlPeriod,htmlStr];
CGSize size;
size = [chatRoomInfo.roomName sizeWithFont:[UIFont systemFontOfSize:16.0f]];
[_userNameSearchView loadHTMLString:htmlStrP baseURL:nil];
_userNameSearchView.frame = CGRectMake(kAvatarHeadViewX + kAvatarHeadViewW + 10, kUserNameSpace, size.width, 18);