(iPhone/iOS) UISearchBar范围按钮覆盖第一行UITableView



我知道这个问题以前有人问过,但我还没有找到一个真正的解决方案。我有一个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
}

最新更新