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

来源:互联网 发布:俄罗斯 美国 知乎 编辑:程序博客网 时间:2024/06/06 04:19

项目介绍

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

主要功能:

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

  • 上拉、点击屏幕或点击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哦-_-

2 0
原创粉丝点击