在UITableView顶部添加搜索栏

7
我有一个UITableView,并正在添加一个自定义的搜索栏,它由一个包含UITextField的UIView组成。与iOS应用程序的标准相同,当向下滚动时,搜索栏应该消失在屏幕上,连同其他单元格一起消失,只有当滚动到顶部时才可见。
然而,我无法找到实现此效果的方法。如果我将搜索栏放在表视图的顶部,它将覆盖其下面的单元格。如果我将其放在距离表视图50像素的地方,用户在释放手指后,它会自动消失,因此无法选择它。
请问有人知道如何实现这个效果吗?
3个回答

23

通常,您只需将UISearchBar用作表视图的tableViewHeader。如果您希望在用户进入屏幕时隐藏它(就像大多数本机应用程序中所做的那样),则可以在viewWillAppear中为tableView设置contentOffset
我相信这实际上就是他们的做法。如果您考虑一下,这也是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中,如果您的视图控制器将automaticallyAdjustsScrollViewInsets设置为YES,则不应该仅将tableViewcontentOffset设置为CGPointMake(0., CGRectGetHeight(self.tableView.tableHeaderView.frame)),因为在viewWillAppear:中它很可能不是CGPointZero

不错,但是@dariaa,如果搜索栏中没有任何内容,你将如何触发隐藏? - Stéphane de Luca

11

@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
}

如果你想要使用搜索栏,你可能需要将其设置为属性。


1
如果只想在UITableView滚动到顶部时可见搜索结果,可以创建一个UITableViewCell子类来容纳UISearchBar。然后,在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的行和部分,但我是凭记忆编写这段代码的,不记得有更好的方法了。


2
搜索栏不应该显示在单元格中,而是应该显示在表视图的标题中。 - Frederic Adda

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接