我知道之前已经问过这个问题,但我还没有找到真正的解决方案。我有UITableView
UISearchBar
作为tableHeaderView.
每当范围按钮出现时,它们都会覆盖UITableView
的第一行。
我已尝试使用UITableView.contentOffset
将UITableView
偏移范围按钮的高度,这一直有效,直到用户点按UITableView
或滚动UITableView
,此时{ {1}}跳回原来的偏移量。
我能做的最好的事情是将UISearchBar
设置为视图中的单独项目,只需动态调整UITableView
的大小,以便在用户点按搜索按钮时显示或隐藏它。唯一的问题是没有动画,所以过渡是尖锐的。
更新:我通过实施UISearchDisplayController
解决了这个问题,因为这是最干净,最简单的解决方案。 UISearchDisplayController
会自动显示/隐藏范围按钮,并相应地向下移动UITableView
。起初我没有这样做,因为我希望UITableView
保持可见而不是最初被UISearchDisplayController
遮挡,但是我已经意识到停电并不妨碍任何功能;如果用户想继续以UITableView
的方式查看,那么用户就不会发起搜索。
答案 0 :(得分:3)
思路:
将tableHeaderView
设置为UIView
作为其子视图的UISearchBar
,并在显示范围按钮时调整UIView
的大小。 UITableView
希望能够回应改变其框架的观点。
将UISearchBar
设置为UITableView
的第一个单元格的内容,并在范围按钮隐藏或显示时使用(void)reloadRowsAtIndexPaths:(NSArray *)indexPaths withRowAnimation:(UITableViewRowAnimation)animation
。返回适当的高度,让细胞动画到新的高度。
或者您可以使用您描述的方法(UISearchBar
作为视图中的单独项目),并使用动画块为过渡设置动画,使其不那么清晰。
[UIView animateWithDuration:1.0 animations:^
{
//change table view frame here
}];
答案 1 :(得分:0)
如果您根据搜索控制器是否处于活动状态来调整标题的单元格高度,则一切正常
func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
var headerHeight: CGFloat = 0.0
if searchController.isActive
{
headerHeight = searchController.searchBar.frame.size.height
}
return headerHeight
}