我有一个UITableView,我目前正在努力在顶部添加一个自定义搜索栏,其中包含一个带有UITextField的UIView。作为iOS应用程序的标准,搜索栏应该只在表格视图滚动到顶部时才可见 - 向下滚动时,它应该与其他单元格一起从屏幕上消失。
然而,我无法找到实现这种效果的方法。如果我将搜索栏放在表格视图的顶部,它将覆盖其下方的单元格。如果我将它放在桌面视图上方50个像素,则用户无法选择它,因为当用户从屏幕上松开手指时它会自动消失。
有人可以告诉我如何实现这种效果吗?
答案 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的行和部分,但是我将这段代码写下来并且不记得更好的方法。