UISearchController使用中遇到的坑

这次开发需要用到搜索框, 以前大都是使用UITtexField进行自定义的,这次使用了UISearchController. 

 在iOS8之前,使用的的是UISearchDisplayController+SearchBar的组合, iOS8之后,原有的方式废弃, 苹果推荐使用UISearchController,其本身包括searchBar.但是使用中出现了一系列问题

 UISearchController一般是结合一个表视图使用, 一般是初始化后,它的searchBar设置成tableview的tableviewHeadView.
 进行搜索数据展示时,可以使用当前tableview进行展示,也可以使用一个新的UITableviewController来进行展示. 我这里使用的是同一个表视图进行展示.
1. 初始化. 由于使用同一个tableview进行展示,所以SearchResultsController就设置成nil;

self.searchController = [[UISearchController alloc]initWithSearchResultsController:nil];
//设置代理
self.searchController.delegate= self;
self.searchController.searchResultsUpdater = self;

//搜索时,背景变暗 
self.searchController.dimsBackgroundDuringPresentation = NO;
//搜索时,背景变模糊 
//self.searchController.obscuresBackgroundDuringPresentation = NO; 
//点击搜索的时候,是否隐藏导航栏
self.searchController.hidesNavigationBarDuringPresentation = YES;
//设置成tableview的tableHeaderView
self.tableView.tableHeaderView = self.searchController.searchBar;
由于系统searchBar样式比较丑, 一般都需要对searchBar的样式进行修改.我这里找到了两种修改方式:
第一种:
   _searchController.searchBar.barTintColor = MAIN_GRAY_COLOR;
    UIImageView *barImageView = [[[_searchController.searchBar.subviews firstObject] subviews] firstObject];
    barImageView.layer.borderColor = MAIN_GRAY_COLOR.CGColor;
    barImageView.layer.borderWidth = 1;

这种方式修改之后,上下会有一条黑线,这条黑线按照网上资料是可以消除的,但是我没有去验证,所以暂时不提.
第二种:
 //设置searchField的背景
    UIImage *bgImgae = [UIImage imageNamed:@"ic_white_bg"];
    [_searchController.searchBar setBackgroundImage:bgImgae];

    // 设置搜索框内部textField的背景图

    UIImage *fieldBg = [UIImage imageNamed:@"ic_gray_bg"];
    [self.searchController.searchBar setSearchFieldBackgroundImage:fieldBg forState:UIControlStateNormal];

    用第二种方式你可以将搜索框(实际是输入文字的textField),改编成任意样式,只要UI给你想要的图. 这张图片必须是真实存在的,不能用颜色生成一张图片, 我之前这样使用,并没有起到相应的效果.
下面写一下我遇到的几个问题,以及在查资料时看到的几个常见的问题:
1. 点击输入框,UISearchBar 位置不对:
    在进行searchBar的文字设置之后:
    self.searchController.searchBar.placeholder= @"请输入关键字搜索";
    [self.searchController.searchBar sizeToFit];
    在viewDidLoad中进行设置:
    self.definesPresentationContext = YES;
    问题解决;
2. 接上一步操作,点击输入框之后,searchBar上移,表视图跟着上移,你会发现,表视图的一部分被searchBar遮住了:
    在viewDidLayoutSubviews 中进行设置:
- (void)viewDidLayoutSubviews{

    [super viewDidLayoutSubviews];

    CGRect frame = CGRectMake(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT);

    if(self.searchController.active) {

        [self.tableView setFrame:CGRectMake(0,20 ,SCREEN_WIDTH,self.view.height -20)];

    }else{

        self.tableView.frame =  self.view.bounds;
    }
}
问题解决.
3.  继续接上一步,搜索完之后,数据展示出来,点取消或者其它操作,回到初始位置,你会发现,表视图的仍然被searchBar遮住一部分.效果和步骤2几乎是一样的,你需要如下设置:
在UISearchResultsUpdating的这个代理方法中
- (void)updateSearchResultsForSearchController:(UISearchController *)searchController {
    self.edgesForExtendedLayout = UIRectEdgeNone;
- }
- 问题解决.
在整个使用过程中我主要是遇到了后两个问题,在网友博客的帮助下一点点尝试,最终解决了问题.

我这里只描述了问题出现的情况和解决办法,没有细致的图片展示, 但文字描述的足够清晰, 对于其中的原理我并没有细究. 在使用过程中UISearchController并没有让我感觉到有很好用,因为坑有点多,所以把它记录下来,以便下次使用.

猜你喜欢

转载自blog.csdn.net/xfy6238/article/details/80766516