如何隐藏tableView searchBar

时间:2015-01-15 03:06:47

标签: ios uitableview

我想在tableView中有一个默认隐藏的searchBar,但是如果用户下拉它会出现。

所以我使用了下面的代码来实现这个,但是当第一次显示视图时,searchBar暂时可见,我想避免这个简短的闪存。将self.tableView.contentOffset = CGPointMake(0, 0)添加到viewDidLoad()方法没有任何影响。请注意,tableView位于导航控制器后面,这就是为什么将Y偏移设置为0有效地隐藏了导航栏后面的searchBar。知道如何确保在首次显示视图时隐藏tableView的headerView。

我考虑过只删除headerView,但用户无法向下拖动来访问它。

override func viewDidLoad() {
    super.viewDidLoad()

    searchBar.delegate = self
    searchBar.frame = CGRectMake(0, 0, self.tableView.frame.size.width, 44)
    if let tv = self.tableView {
        if let headerView = tv.tableHeaderView {
            headerView.addSubview(searchBar)
        } else {
            FLOG("No table header view is available so create one!")
            let headerView = UIView()
            let width: CGFloat = tv.frame.size.width
            headerView.frame = CGRectMake(0, 0, width, 44);
            tv.tableHeaderView = headerView
            tv.tableHeaderView!.addSubview(searchBar)
        }
    }        
}
override func viewWillAppear(animated: Bool) {
    super.viewWillAppear(animated)
    dispatch_after(0, dispatch_get_main_queue()) {
        self.tableView.contentOffset = CGPointMake(0, 0)
    }
}

1 个答案:

答案 0 :(得分:0)

我认为viewWillAppearviewDidLoad存在排序问题。据我所知,每次绘制视图并将其添加到视图层次结构时都会调用viewWillAppear,而当VC首次加载其子视图时会调用viewDidLoad。

所以,我想在你第一次运行视频时会通过mainQueue加载viewDidLoad将搜索栏置于(0,44),然后viewWillAppear被调用但实际上会导致由于调用移动表格在mainQueue上的偏移量而产生的短暂视觉短片。但是在后续调用中,由于viewDidLoad已经发生,因此只会调用viewWillAppear。并且由于搜索栏不是首先从(0,44)开始然后需要移动到(0,0),所以没有blip。

不是直接为搜索栏定义框架,而是在将其添加到tableHeader后尝试在其上调用sizeToFit。其次,我不相信你必须实例化标题视图,只需将其设置为等于搜索栏即可。最后,从dispatch_queue中取出contentOffset调用,它应该由viewWillAppear按原样正确处理。

我最近深入了解iOS8的UISearchController,并记录了这段旅程(至少部分)。对于我使用的代码,here's a link to the implementation filecorresponding write-up我做了。它在ObjC中,所以你需要做一些翻译。但它看起来像:

 self.searchController = [[UISearchController alloc] initWithSearchResultsController:self.filteredResultsTableViewController];
 self.searchBar = self.searchController.searchBar; 

 // other code ...

 [self.searchBar sizeToFit];

 // other code ...

 self.tableView.tableHeaderView = self.searchBar;