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

Posted

技术标签:

【中文标题】(iPhone/iOS) UISearchBar Scope Buttons 覆盖 UITableView 的第一行【英文标题】:(iPhone/iOS) UISearchBar Scope Buttons cover first row of UITableView 【发布时间】:2011-11-07 18:23:29 【问题描述】:

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

我曾尝试使用UITableView.contentOffsetUITableView 偏移范围按钮的高度,这一直有效,直到用户点击UITableView 或滚动它,此时UITableView 跳回其原始偏移量。

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

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

【问题讨论】:

【参考方案1】:

想法:

tableHeaderView 设置为以UISearchBar 作为其子视图的UIView,并在出现范围按钮时调整UIView 的大小。 UITableView 有望响应该视图更改其框架。

UISearchBar 设置为UITableView 的第一个单元格的内容,并在范围按钮隐藏或显示时使用(void)reloadRowsAtIndexPaths:(NSArray *)indexPaths withRowAnimation:(UITableViewRowAnimation)animation。返回适当的高度以使单元格动画到其新高度。

或者您可以使用您描述的方法(UISearchBar 作为视图中的单独项目),并使用动画块为过渡设置动画,使其不那么锐利。

[UIView animateWithDuration:1.0 animations:^
  
     //change table view frame here
  ];

【讨论】:

【参考方案2】:

如果您根据搜索控制器是否处于活动状态来调整标题的单元格高度,则一切正常

func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat 

    var headerHeight: CGFloat = 0.0

    if searchController.isActive
    
        headerHeight = searchController.searchBar.frame.size.height
    

    return headerHeight

【讨论】:

以上是关于(iPhone/iOS) UISearchBar Scope Buttons 覆盖 UITableView 的第一行的主要内容,如果未能解决你的问题,请参考以下文章

单击 UISearchBar 的取消按钮后,如何使用 UISearchBar 刷新我的 UITableView?

UISearchBar becomeFirstResponder 返回 0,但对 UISearchBar 有有效引用

搜索栏UISearchBar的使用

UISearchBar

iOS学习—— UISearchBar的使用

UISearchBar 和 resignFirstResponder