(iPhone / iOS)UISearchBar Scope Buttons覆盖UITableView的第一行

时间:2011-11-07 18:23:29

标签: iphone uitableview button scope uisearchbar

我知道之前已经问过这个问题,但我还没有找到真正的解决方案。我有UITableView UISearchBar作为tableHeaderView.每当范围按钮出现时,它们都会覆盖UITableView的第一行。

我已尝试使用UITableView.contentOffsetUITableView偏移范围按钮的高度,这一直有效,直到用户点按UITableView或滚动UITableView,此时{ {1}}跳回原来的偏移量。

我能做的最好的事情是将UISearchBar设置为视图中的单独项目,只需动态调整UITableView的大小,以便在用户点按搜索按钮时显示或隐藏它。唯一的问题是没有动画,所以过渡是尖锐的。

更新:我通过实施UISearchDisplayController解决了这个问题,因为这是最干净,最简单的解决方案。 UISearchDisplayController会自动显示/隐藏范围按钮,并相应地向下移动UITableView。起初我没有这样做,因为我希望UITableView保持可见而不是最初被UISearchDisplayController遮挡,但是我已经意识到停电并不妨碍任何功能;如果用户想继续以UITableView的方式查看,那么用户就不会发起搜索。

2 个答案:

答案 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
}