在 tableHeaderView 中使用 UIView 创建 UISearchBar 行为

Posted

技术标签:

【中文标题】在 tableHeaderView 中使用 UIView 创建 UISearchBar 行为【英文标题】:Create the UISearchBar behavior with an UIView in a tableHeaderView 【发布时间】:2012-01-11 17:37:00 【问题描述】:

如果我有一个 UISearchBar 到 tableHeaderView,当我向下滚动表格视图时,搜索栏会自动隐藏。我想要相同的行为,而是将 UISearchBar 添加到我想添加 UIView 的 tableHeaderView。

这是问题的视频:

http://www.youtube.com/watch?v=NPTRaT2A5vU

【问题讨论】:

【参考方案1】:

在 ViewController(不是 TableViewController)中使用 TableView,然后只将 SearchBar 添加到该视图的顶部(调整 tableview 的大小以适应)。我对几乎所有需要使用 SearchBar 进行过滤的 VC 执行此操作。这使搜索栏始终可见并且运行良好。

如果需要,我可以发送一个完整的示例

【讨论】:

这不是我想要的解决方案。而不是我想要的 UIsearchBar 和 UIView 具有相同行为的 UISearchBar 至极当我向上滚动视图时出现但向下滚动时视图隐藏在导航栏后面。【参考方案2】:

我还没有看到一个解决方案,正确 模仿您从分配给 UINavigationController 内的 UITableView.tableHeaderView 的 UISearchBar 获得的自动(据我所知未记录)滚动行为。除了您的视频之外,这种行为也可以在 Apple 的 ios 应用(如邮件和音乐)中看到。

我发现实现此目的的一种方法是将 UISearchBar 分配给 tableHeaderView,然后将您的自定义视图添加到 UISearchBar 的顶部(这是 UIView 子类)。您仍然可以获得特殊的表格滚动行为来隐藏和显示表格标题,但使用您自己的视图。这假设您可以使您的视图与 UISearchBar 的大小相同。

例如在viewDidLoad中:

self.tableView.tableHeaderView = [[[UISearchBar alloc] initWithFrame:CGRectMake(0.0f, 0.0f, 320.0f, 44.0f)] autorelease];
[self.tableView.tableHeaderView addSubview:myView];

诚然,这有点小技巧,但这种策略似乎确实有效。

【讨论】:

【参考方案3】:

所以从字面上看,该视频的作用是它没有添加 tableHeaderView,而是使用 cells .contentView 属性将自定义视图放在第一个单元格中,然后开始添加测试单元格。因此,您使用 cellViewForIndexPath 方法获取 indexPath 并检查它是否为 0,如果是,则添加您的自定义视图。否则,然后添加单元格。视频所做的只是将单元格向下移动一个,并使用代码向 cell0 添加一个视图

[cell.contentView addSubview:CustomView];

这就是您在其中放置自定义视图所需的全部内容。

【讨论】:

没有。我希望表格标题视图中视频中的红色矩形具有与搜索栏相同的行为。在视频中,当我向下滚动时搜索栏会隐藏,但 uiview(红色矩形)不会隐藏。当我像搜索栏一样向下滚动时,我想隐藏红色矩形。 红色矩形在表格标题视图内,而不是在表格视图单元格中。【参考方案4】:

如果有人像我一样读到这篇文章,我已经找到了解决这个问题的方法。很简单

myTableView.contentOffset = CGPointMake(0, heightOfView);

所以你必须知道这个视图的高度,这个解决方案还有另一个缺点。如果表格视图中没有足够的内容可滚动并且您向下滚动视图将被显示并且您不能再隐藏它。就我而言,这目前是可以接受的。

如果有人让 UISearchBar 功能与 UIView 一起工作。请发帖:)

希望这对某人有所帮助

【讨论】:

【参考方案5】:

重申 Daan Vermeulen 的回答,只需将滚动视图偏移搜索栏的高度即可。由于我在表格的标题视图中添加了搜索栏,因此我将滚动向上移动标题视图高度的高度。我的目标是 iOS8,这就是 viewdidload 方法;所以代码位如下:

//initiate the search controller
//use the original tableview controller itself to manage search
//don't dim the underlying content to show the filtered results as the user types into the search bar.
//search scope bar is not used. assign an empty array to the scopebuttontitles property (this is required with iOS8)
self.searchController = [[UISearchController alloc] initWithSearchResultsController:nil];
self.searchController.searchResultsUpdater = self;
self.searchController.dimsBackgroundDuringPresentation = NO;
self.searchController.searchBar.scopeButtonTitles = [[NSArray alloc] init];

//use the original tableview controller as a delegate and implement the UISearchResultsUpdating protocol
//add the search bar view to the table view header
//search view covers the table view when active. make the table view controller define the presentation context
//to ensure that search bar fits the screen. (this is required with iOS8)
self.searchController.searchBar.delegate = self;
self.tableView.tableHeaderView = self.searchController.searchBar;
self.definesPresentationContext = YES;
[self.searchController.searchBar sizeToFit];

//offset scrollview content by tableheaderview height
self.tableView.contentOffset = CGPointMake(0, self.tableView.tableHeaderView.bounds.size.height);

【讨论】:

以上是关于在 tableHeaderView 中使用 UIView 创建 UISearchBar 行为的主要内容,如果未能解决你的问题,请参考以下文章

在 tableHeaderView iOS 7 中使用 UISearchBar 访问错误

在 iOS7 中使用 UISearchBar 将子视图添加到 tableHeaderView 行为不端

如何更改情节提要中 tableHeaderView 的高度?

UISearchBar 和 tableHeaderView

UITableView 把 tableHeaderView 和 sectionHeaderView 一起粘在上面

隐藏导航栏后面的 tableHeaderView