以编程方式实现不滚动的搜索栏

时间:2014-06-10 16:18:33

标签: ios objective-c uisearchbar

我正在努力实施基本搜索栏。当表格滚动时,我无法弄清楚如何使搜索栏坚持到标题。这是我加载搜索栏的代码:

-(void)loadbar{
searchBar = [[UISearchBar alloc] initWithFrame:CGRectMake(0, 0, 320, 44)];
searchDisplayController = [[UISearchDisplayController alloc] initWithSearchBar:searchBar         contentsController:self];
searchDisplayController.delegate = self;
searchDisplayController.searchResultsDataSource = self;
self.tableView.tableHeaderView = searchBar;
}

搜索栏继承自UISearchBar,searchDisplayController继承自UISearchDisplayController

谢谢!

2 个答案:

答案 0 :(得分:2)

表格的标题视图随表格滚动。如果您不希望搜索栏按表格视图滚动,则无法将搜索栏设置为标题视图。

您有三种选择。

  1. 将搜索栏添加到导航栏
  2. 使搜索栏成为tableview的子视图。为表格视图实现scrollViewDidScroll:委托方法,并在表格滚动时调整滚动条的位置。
  3. 不要使用UITableViewController。使用UIViewController并添加自己的表格视图。添加搜索栏顶部的搜索栏和搜索栏下方的表格视图。

答案 1 :(得分:0)

解决方案

使用单节表格视图并将搜索栏设置为节标题。

讨论

在此之前,iOS能够识别表格视图标题中何时存在搜索栏。在这种情况下,搜索栏将隐藏在导航栏下方,并且可以向下滚动以显示出来。使用时,搜索栏固定在窗口顶部,而不滚动表格视图内容。从最近开始,这种行为就被打破了:搜索栏随单元格滚动。

在提出的解决方案中,我们将搜索栏设置为节标题。在我们滚动经过该节的末尾之前,该节的标题一直保持可见。因此,如果我们只有一个部分,则搜索栏总是可见的。

Objective-C

// Class members
UISearchBar *searchBar;

- (void)viewDidLoad {

  // Inherited
  [super viewDidLoad];

  // Search Bar
  searchBar = [[UISearchBar alloc] initWithFrame:CGRectMake(0, 0, 320, 44)];
  searchBar.delegate = self;
  searchBar.barStyle = UISearchBarStyleMinimal;
}

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
  // It is mandatory to have one section, otherwise the search bar will scroll
  return 1; 
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {

  // TODO: Return the number of elements in the table
  return 1;
}

- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section {
    return searchBar.frame.size.height;
}

-(UIView*)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section {
    return searchBar;
}