您的位置:首页 > 其它

项目 - 下拉自动弹出搜索框

2015-06-14 10:48 337 查看

项目介绍

下面要实现一个集成下拉弹出搜索框并支持中英文搜索的框架

主要功能:

下拉时搜索框自动弹出,没有进行搜索操作,两秒后自动隐身

上拉、点击屏幕或点击cancer按钮时搜索框隐藏

支持中英文搜索

演示



实现

下拉弹出 上拉隐藏

上拉下拉的操作都是通过UIscrollView的代理方法进行监听

// 开始滑动tableView时调用
- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView
{
[self.view endEditing:YES];

if (self.searchBar.text.length == 0 && self.searchBar.frame.origin.y >= 0) {
self.searchBar.frame = CGRectMake(0, -44, self.view.frame.size.width, 44);

self.switchTip = 0;
}
}

//手指按住屏幕滚动时调用
- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{
if (self.switchTip == 0)
{
if (scrollView.contentOffset.y <= -44)
{
[UIView animateWithDuration:0.3 animations:^{

//设置searchBarframe, 显示出来
self.searchBar.frame = CGRectMake(0, 0, self.view.frame.size.width, 44);

//tableView设置上面间距44
self.tableView.contentInset = UIEdgeInsetsMake(44, 0, 0, 0);
}];

//设置2s后关闭搜索框
[self performSelector:@selector(closeSearch) withObject:nil afterDelay:2];
self.switchTip = 1;
}
}
}


搜索框编辑

对搜索框操作的监听是由
UISearchBarDelegate
这个代理的方法实现的

#pragma mark - UISearchBarDelegate
//当searchBar开始编辑,即当点击搜索框时
- (void)searchBarTextDidBeginEditing:(UISearchBar *)searchBar
{
[self.searchBar becomeFirstResponder];
}

//当在搜索框输入文字时调用
- (void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText
{
self.tmpItems = [self.searchBar searchContent:searchText InArray:self.items];

[self.tableView reloadData];
}

//搜索框结束搜索时调用
- (void)searchBarTextDidEndEditing:(UISearchBar *)searchBar
{
if (self.searchBar.text.length == 0)
{
[self performSelector:@selector(closeSearch) withObject:nil afterDelay:2];
}
}

//点击cancer按钮时执行
- (void)searchBarCancelButtonClicked:(UISearchBar *)searchBar
{
self.searchBar.text = @"";
[self.tmpItems removeAllObjects];
[self.tableView reloadData];
[self.searchBar resignFirstResponder];
}


中英文搜索

这部分主要解决的问题:

中英文混合字符串转换

中文转换为拼音

其他字母、字符保持不变

对检索关键词进行搜索

对检索关键词和搜索池中的字符串都进行转换

把检索到的字符串放到新数组中返回

不多说,直接上代码:

#pragma mark - 中文转换为拼音字符串
- (NSString *)ZHStringChangeToEN:(NSString *)ZHText
{
NSMutableString *stringResult = [NSMutableString string];

for (int i=0; i<ZHText.length; i++)
{
//获取字符range
NSRange range = NSMakeRange(i, 1);

//获取字符,注意CFStringTransform 接收NSMutableString
NSMutableString *keyWord = [[NSMutableString alloc] initWithString:[ZHText substringWithRange:range]];

int keyWordInt = [ZHText characterAtIndex:i];

//判断是否为中文
if (keyWordInt > 0x4e00 && keyWordInt < 0x9fff)
{
//先转换为latin style
CFStringTransform((__bridge CFMutableStringRef)keyWord, 0, kCFStringTransformMandarinLatin, NO);
//再转换为Pinyin
CFStringTransform((__bridge CFMutableStringRef)keyWord, 0, kCFStringTransformStripDiacritics, NO);
}

[stringResult appendString:keyWord];
}

return stringResult;
}


//对关键字进行索引
- (NSMutableArray *)searchContent:(NSString *)searchText InArray:(NSArray *)array
{
NSString *upperSearchString = [[NSString alloc] init];
NSString *upperSearchPoolString = [[NSString alloc] init];

NSMutableArray *searchResultArray = [NSMutableArray array];

upperSearchString = [[self ZHStringChangeToEN:searchText] uppercaseString];

for (int i=0; i<array.count; i++)
{
upperSearchPoolString =  [[self ZHStringChangeToEN:array[i]] uppercaseString];

if ([upperSearchPoolString containsString:upperSearchString])
{
[searchResultArray addObject:array[i]];
}
}

return searchResultArray;
}


遇到问题

中文字符直接串转拼音,拼音间会有空格,对于连续的词就不能进行检索

解决方法就是对字符串单个字符进行转化,然后再拼接起来

搜索框2s后自动隐藏,如果2s以内进行上拉操作,则搜索框不隐藏

- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView
这个方法中隐藏搜索框

GitHub

https://github.com/HuanDay/EasySearchBar

感觉不错的小伙伴给个star哦-_-
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: