将搜索栏添加到UITableView的顶部

wst*_*str 6 search objective-c uitableview uitextfield ios

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

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

有人可以请教我如何实现这种效果?

dar*_*iaa 21

通常您只是UISearchBar用作tableViewHeader表格视图.如果您希望在用户进入屏幕时隐藏它(就像在大多数原生应用程序中一样),您可以设置contentOffsettableViewin 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;
}
Run Code Online (Sandbox Code Playgroud)

请注意,在搭载iOS 7,你不应该仅仅设置contentOffset你的tableViewCGPointMake(0., CGRectGetHeight(self.tableView.tableHeaderView.frame)),如果你viewController已经automaticallyAdjustsScrollViewInsets设置YES的,因为它可能不会是CGPointZeroviewWillAppear:


dav*_*ynn 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
}
Run Code Online (Sandbox Code Playgroud)

虽然您可能需要将searchBar设置为属性,但如果您想使用它.