我知道这个问题以前有人问过,但我还没有找到一个真正的解决方案。我有一个UITableView
和一个UISearchBar
作为它的tableHeaderView.
每当范围按钮出现时,它们覆盖了UITableView
的第一行。
我已经尝试使用UITableView.contentOffset
通过范围按钮的高度来抵消UITableView
,这可以工作,直到用户点击UITableView
或滚动它,此时UITableView
跳回其原始偏移量。
我所能做的最好的是将UISearchBar
设置为视图中的单独项目,并简单地动态调整UITableView
的大小,以便在用户点击搜索按钮时显示或隐藏它。唯一的问题是,没有动画,所以过渡是尖锐的。
更新:我通过实现UISearchDisplayController
解决了这个问题,因为这是最干净和最简单的解决方案。UISearchDisplayController
自动显示/隐藏范围按钮,并相应地向下移动UITableView
。我一开始没有这样做,因为我想让UITableView
保持可见,而不是最初被UISearchDisplayController
黑掉,但我已经意识到,停电并不妨碍任何功能;如果用户想继续查看UITableView
,他就不会发起搜索了。
创意:
-
将
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
}];
如果你根据搜索控制器是否激活来调整页眉的单元格高度,一切正常
func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
var headerHeight: CGFloat = 0.0
if searchController.isActive
{
headerHeight = searchController.searchBar.frame.size.height
}
return headerHeight
}