隐藏 UITableView 搜索栏

Posted

技术标签:

【中文标题】隐藏 UITableView 搜索栏【英文标题】:Hide UITableView search bar 【发布时间】:2012-03-21 05:06:57 【问题描述】:

我有一个 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 行上方留下一个很大的空隙,大概是搜索栏所在的位置。

如果有人能提供帮助,我们将不胜感激。

【问题讨论】:

搜索栏隐藏后表格有2行,每行70px高,表格高度=367,内容offset.y=0,内容inset.top=-75,inset.bottom =0,一切如预期。是什么让我卡在这里是导致“底部反弹”的原因?当内容只有 140px 高并且视图是 367 高时,滚动视图不应该让我滚动,但是为什么我可以滚动第一行呢? 【参考方案1】:

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

我能找到的唯一前进方法是放弃 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 麻烦多于它的价值。然后,以大致相同的频率,我忘记了我学会了这一点。

【讨论】:

【参考方案2】:

采用“alpha”方法:

[controller.searchBar setAlpha:0.0]; 

[controller.searchBar setAlpha:1.0]; 

【讨论】:

感谢您的想法,但没有区别。【参考方案3】:

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

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

这仅在有足够的条目以完全填满屏幕时才有效。当然,如果你只有一两个条目,你可能不关心隐藏搜索栏。

【讨论】:

以上是关于隐藏 UITableView 搜索栏的主要内容,如果未能解决你的问题,请参考以下文章

是否可以隐藏 UITableView 的行但不能隐藏搜索栏?

在导航控制器中默认隐藏 UITableView 搜索栏

UITableView 中的搜索栏

如果向上滚动,UITableview 标题不会再次显示

UITableView 标题视图调整大小

Swift uiview 在 uitable 之上