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

项目介绍

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

主要功能:

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

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

你可能感兴趣的:(下拉搜索)