iOS修复UITableViewController顶部的搜索栏?

我在表头上添加搜索栏并将其浮动在scrollViewDidScroll方法中,但是当我滚动而不点击搜索栏(即我转到视图并滚动)时,搜索栏不会保持在顶部但它向上滚动然而,一旦我点击搜索栏并点击搜索栏上的取消按钮,然后如果我滚动表格,搜索栏保持在顶部。这是我的代码 –

 -(void)viewDidLoad { [super viewDidLoad]; UISearchBar *searchBar = [[UISearchBar alloc] initWithFrame:CGRectMake(0, 0, 320, 44)]; searchBar.delegate = self; searchDisplayController = [[UISearchDisplayController alloc] initWithSearchBar:searchBar contentsController:self]; searchDisplayController.delegate = self; searchDisplayController.searchResultsDataSource = self; searchDisplayController.searchResultsDelegate = self; UIView *tableHeaderView = [[UIView alloc] initWithFrame:searchDisplayController.searchBar.frame]; [tableHeaderView addSubview:searchDisplayController.searchBar]; [tableView setTableHeaderView:tableHeaderView]; isSearching = NO; } -(void)scrollViewDidScroll:(UIScrollView *)scrollView { UISearchBar *searchBar = searchDisplayController.searchBar; CGRect searchBarFrame = searchBar.frame; if (isSearching) { searchBarFrame.origin.y = 0; } else { searchBarFrame.origin.y = MAX(0, scrollView.contentOffset.y + scrollView.contentInset.top); } searchDisplayController.searchBar.frame = searchBarFrame; } - (void)searchDisplayControllerWillBeginSearch:(UISearchDisplayController *)controller { isSearching = YES; } -(void)searchDisplayControllerWillEndSearch:(UISearchDisplayController *)controller { isSearching = NO; } 

请注意,我正在使用UITableViewController子类,并且不想将其更改为UIViewController 。 任何帮助,将不胜感激。

编辑:我也在这个UITableViewController使用节头,在其他UITableViewController中没有节头,这个代码工作正常。这是一个问题与节头和表头一起?

您的搜索栏滚动表内容的原因是您已将其直接放在表中,从而使其成为表的子标题部分。 那部分总是滚动…

以下是如何实现这一目标的。 它实际上非常简单。 (以下示例依赖于Storyboard,但无论您使用什么,机制都是相同的):

1)使用UIVIewController不是 UITableViewController

2)添加UITableView作为 UIView子级

3)添加UISearchBarController也作为UIView视图,而不是UITableView视图(UITableView和UISearchController是兄弟姐妹)

你应该有以下布局:

在此处输入图像描述

编辑:要记住的重要一点是将UISearchBarController放在兄弟UITableView上 。 否则,当后者聚焦时,您可能会看到UITableView UISearchBarController 重叠

编辑2:顺便说一句,如果你使用AutoLayout,记得设置tableView相对于SearchBar的TOP约束…

运行它并欣赏结果。

希望这可以帮助。

没有办法维护tableView的标头

1-可以使用UIViewController而不是UITableViewController。

2-为标题添加子视图(UIView)。

3-并为tableview添加另一个子视图。

Interesting Posts