隐藏UITableView搜索栏

时间:2012-03-21 05:06:57

标签: iphone ios uitableview uisearchbar uisearchdisplaycontroller

我有一个UITableViewController,它以标准方式设置了UISearchDisplayController(在tableView中有搜索栏)。我希望搜索栏开始隐藏 - 真的隐藏了,而不仅仅是滚动as in this solution。然后我想在用户按下按钮时显示搜索UI,并在用户选择搜索中找到的项目之后再次隐藏它(真正隐藏它)。

以下是几乎可以使用的代码:

- (void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];

    self.searchDisplayController.searchBar.prompt = @"Add an item";
    self.searchDisplayController.searchBar.placeholder = @"Type the item name";

    // i do this to trigger the formatting logic below
    [self.searchDisplayController setActive:YES animated:NO];
    [self.searchDisplayController setActive:NO animated:NO];
    // rest of my view will appear
}

- (void)searchDisplayControllerDidEndSearch:(UISearchDisplayController *)controller {

    NSTimeInterval duration = (self.isViewLoaded && self.view.window)? 0.3 : 0.0;
    __block CGFloat searchBarHeight = controller.searchBar.frame.size.height;

    [UIView animateWithDuration:duration animations:^{
        self.tableView.contentOffset = CGPointMake(0, searchBarHeight);
        self.tableView.contentInset = UIEdgeInsetsMake(-searchBarHeight, 0, 0, 0);  // trouble here, I think
    } completion:^(BOOL finished) {
        controller.searchBar.hidden = YES;
    }];
}

显示

- (IBAction)pressedAddButton:(id)sender {

    self.searchDisplayController.searchBar.hidden = NO;
    [self.searchDisplayController setActive:YES animated:YES];
}

我认为我正确设置内容插入,但它的行为出乎意料:如图所示的代码,该表允许内容向上移动太远,即只有两个不太高的行,我能够向下滚动,将这两排中的大部分推到桌子顶部......就像没有底部弹跳一样。当我注释掉contentInset行时,该表允许我将内容拉得太远,在第0行上方留下一个很大的间隙,大概是搜索栏隐藏的位置。

如果有人可以提供帮助,那就太有必要了。

3 个答案:

答案 0 :(得分:11)

对于可能遇到此问题的任何人(似乎没有人) -

我能找到的唯一方法是放弃UITableViewController,转而使用带有uiview的UIViewController,其子视图是表视图和搜索栏。

我按上述方式管理布局:

- (void)setSearchHidden:(BOOL)hidden animated:(BOOL)animated {

    UISearchBar *searchBar = self.searchDisplayController.searchBar;
    CGFloat searchBarHeight = searchBar.frame.size.height;

    CGFloat offset = (hidden)? -searchBarHeight : searchBarHeight;
    NSTimeInterval duration = (animated)? 0.3 : 0.0;

    [UIView animateWithDuration:duration animations:^{
        searchBar.frame = CGRectOffset(searchBar.frame, 0.0, offset);
        self.tableView.frame = UIEdgeInsetsInsetRect(self.tableView.frame, UIEdgeInsetsMake(offset, 0, 0, 0));
    } completion:^(BOOL finished) {if (!hidden) [searchBar becomeFirstResponder];}];
}

除了在add函数开始和结束时调用的方法。

(大约每年两次,我得出的结论是UITableViewController比它的价值更麻烦。然后,在大致相同的频率,我忘了我学到了这一点。

答案 1 :(得分:0)

采用“alpha”方法:

[controller.searchBar setAlpha:0.0]; 

[controller.searchBar setAlpha:1.0]; 

答案 2 :(得分:0)

如果表格中有足够的条目,您可以执行以下操作:

[self.tableView scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:0] atScrollPosition:UITableViewScrollPositionTop animated:NO];

这仅在有足够的条目完全填满屏幕时才有效。当然,如果您只有一个或两个条目,则可能无需隐藏搜索栏。