我想在iPhone Contacts应用程序中复制搜索栏的粘性行为。

当用户向下滚动 View 时,搜索栏也会随着 View 一起下降:

如果用户向上滚动,则表将随之滚动,并具有以下两种行为:

(1)搜索栏的固定在顶部,并且
(2)后继节标题适本地停止在搜索栏下方:

当下一部分标题出现时,前一个标题将消失在搜索栏下方:

注意:分区索引控件(右侧的a-z)也显示在搜索栏的顶部。 Ergo,对contentInset摆弄手脚,就会将部分索引控件随之下推。

我创建了一个自定义UIViewController,添加了UITableView,将其contentInset设置为搜索栏的高度。我创建了一个UIView,将搜索栏添加为其 subview ,然后将UIView添加到UITableView。但是,如上所述,当用户滚动时,节标题仍然停留在y位置零,而不是标题高度。此外,节头索引控制位置受到不利影响。

我希望能解决这个问题。

最佳答案

使所有事情都正确的工作已经很多,但是我只需要证明至少有可能重现这种行为是可能的。
看看我创建的这个GitHub项目:https://github.com/fabiankr/TableViewSearchBar

实际上,它还没有那么复杂:
1)将搜索栏直接添加到表格 View 并设置tableView的contentInset2)在-scrollViewDidScroll:中调整搜索栏的框架

但是,您需要注意一些注意事项:
1)将表格 View 滚动到顶部时,部分标题很快出现在搜索栏上方。为了解决它,滚动到顶部时设置搜索栏的zPosition2)您的内容 Controller 需要是UIViewController的子类,而不是UITableViewController,因为UISearchDisplayController将调光 View 添加到 Controller 的 View 。由于表 View Controller 的view是表 View ,因此滚动表 View 时,调光 View 将位于错误的位置。

仅使用公共(public)API不可能做的一件事就是使表右侧的节索引控件与搜索栏重叠。这只是一件小事,即使没有它,其行为也与“联系人”应用程序中的行为非常相似。

为了实现完全相同的行为,您必须使用私有(private)API。在UITableView上有一种需要使用的方法称为_setPinsTableHeaderView:。该示例项目包含以下两种实现:1)仅公共(public)API和2)私有(private)API,以使节索引控件与搜索栏重叠。
提醒:打算将应用程序提交到App Store时,您不应使用私有(private)API!

关于iphone - 粘性搜索栏和节标题的行为类似于 native “联系人”应用程序,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14759506/

10-12 23:30