(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.contentOffset
将UITableView
偏移范围按钮的高度,这一直有效,直到用户点击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?