iOS修复UITableViewController顶部的搜索栏?

时间:2014-07-17 06:26:07

标签: ios objective-c uisearchbar

我在表格标题上添加搜索栏并将其浮动在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中没有节标题,此代码正常工作。这是节标题的问题和表头一起?

2 个答案:

答案 0 :(得分:16)

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

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

1)使用 UIVIewController NOT a UITableViewController

2)添加 UITableView 作为 UIView 孩子

3)添加 UISearchBarController 也作为 UIView 视图,不作为UITableView的子项 strong>(UITableView和UISearchController是兄弟姐妹)

你应该有以下布局:

enter image description here

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

编辑2:顺便说一句,如果您使用的是AutoLayout,请记住设置tableView相对于SearchBar的TOP约束...

运行它并欣赏结果。

希望这有帮助。

答案 1 :(得分:3)

没有办法维护tableView固定的标头

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

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

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