我想在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的contentInset
2)在-scrollViewDidScroll:
中调整搜索栏的框架
但是,您需要注意一些注意事项:
1)将表格 View 滚动到顶部时,部分标题很快出现在搜索栏上方。为了解决它,滚动到顶部时设置搜索栏的zPosition
2)您的内容 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/