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添加另一个子视图。