将搜索栏添加到UITableView的顶部

时间:2014-04-04 17:49:02

标签: ios objective-c uitableview search uitextfield

我有一个UITableView,我目前正在努力在顶部添加一个自定义搜索栏,其中包含一个带有UITextField的UIView。作为iOS应用程序的标准,搜索栏应该只在表格视图滚动到顶部时才可见 - 向下滚动时,它应该与其他单元格一起从屏幕上消失。

然而,我无法找到实现这种效果的方法。如果我将搜索栏放在表格视图的顶部,它将覆盖其下方的单元格。如果我将它放在桌面视图上方50个像素,则用户无法选择它,因为当用户从屏幕上松开手指时它会自动消失。

有人可以告诉我如何实现这种效果吗?

3 个答案:

答案 0 :(得分:19)

通常,您只需使用UISearchBar作为tableViewHeader用于表格视图。如果您希望在用户进入屏幕时隐藏它(就像在大多数原生应用中完成的那样),您只需为contentOffset中的tableView设置viewWillAppear
而且我很确定他们是如何做到的。如果你仔细想想它是tableHeaderView的意思。

尝试这样的事情:

- (void)viewDidLoad
{
    [super viewDidLoad];

    UISearchBar *searchBar = [[UISearchBar alloc] initWithFrame:CGRectMake(0., 0., 320., 44.)];
    self.tableView.tableHeaderView = searchBar;
}

- (void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];

    CGPoint contentOffset = self.tableView.contentOffset;
    contentOffset.y += CGRectGetHeight(self.tableView.tableHeaderView.frame);
    self.tableView.contentOffset = contentOffset;
}

请注意,在iOS 7中,如果contentOffset tableView设置为{{1},则不应将CGPointMake(0., CGRectGetHeight(self.tableView.tableHeaderView.frame))的{​​{1}}设置为viewController因为automaticallyAdjustsScrollViewInsets

中可能不会YES

答案 1 :(得分:9)

@ dariaa的答案更新为Swift 3:

override func viewDidLoad() {
    super.viewDidLoad()
    let searchBar = UISearchBar(frame: CGRect(x: 0, y: 0, width: self.view.frame.size.width, height: 44))
    self.tableView.tableHeaderView = searchBar
}
override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    var contentOffset: CGPoint = self.tableView.contentOffset
    contentOffset.y += (self.tableView.tableHeaderView?.frame)!.height
    self.tableView.contentOffset = contentOffset
}

如果你想使用它,你可能需要将searchBar设置为属性。

答案 2 :(得分:1)

如果您只想在UITableView一直滚动到顶部时显示您的搜索,请创建一个包含UISearchBar的UITableViewCell子类。然后,在tableView:cellForRowAtIndexPath中,检查indexPath是否为(0,0)。这是表格视图,告诉您它正在最顶层创建单元格,因此只需创建搜索栏单元格而不是默认单元格。

代码看起来像这样:

- (void)viewDidLoad
{
     [self.tableView registerClass:[SearchBarCell class] forCellReuseIdentifier:@"SearchBarCell"];
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    if (indexPath.row == 0 && indexPath.section == 0) {
        //this is the cell that displays the UISearchBar
        SearchBarCell *cell = [tableView dequeueReusableCellWithIdentifier:@"SearchBarCell"];
        return cell;
    }
    else {
        //create your usual table view cell normally
    }
}

可能有一种更简洁的方法来确定indexPath的行和部分,但是我将这段代码写下来并且不记得更好的方法。