UITableView Header中的UISearchBar范围按钮隐藏表视图的第一行

时间:2016-04-12 23:59:56

标签: ios xcode swift uitableview uisearchbar

我遇到了问题:我的UIView包含UISearchBar作为UITableView的标头。问题是每当我点击UISearchBar时,动画范围按钮就会隐藏表格第一行的一部分。我看了很多类似的问题,但没有一个答案奏效。有没有办法向headerView添加底部约束,以便只要UITableView被聚焦并被编辑,UISearchBar就会降低范围按钮视图的高度?

这是我添加UISearchController

的代码
searchController.searchResultsUpdater = self
searchController.dimsBackgroundDuringPresentation = false
definesPresentationContext = true
searchController.searchBar.scopeButtonTitles = ["Groups", "People"]
tableView.tableHeaderView = searchController.searchBar
searchController.searchBar.delegate = self
searchController.searchBar.sizeToFit()
searchController.searchBar.barTintColor = darkGreen
searchController.searchBar.tintColor = yellow
searchController.searchBar.backgroundColor = darkGreen
tableView.sectionHeaderHeight = UITableViewAutomaticDimension

如果你能告诉我怎样才能解决这个问题,我真的很感激!

谢谢!

7 个答案:

答案 0 :(得分:4)

这是因为HeaderView高度设置为Searchbar高度,最初为44。但是一旦你点击搜索栏,搜索栏就会以模态方式显示,并随着范围按钮移动到顶部,但底层的HeaderView高度仍然是44,而不是88(搜索栏高度+范围按钮高度)

对于我的处理方式是 -

1)实施 - UISearchControllerDelegate并使用searchController.delegate = self;

进行分配

2)覆盖UISearchControllerDelegate方法 -

-(void) didPresentSearchController:(UISearchController *)searchController {
    [self fnResizeTableViewHeaderHeight];
}

-(void) didDismissSearchController:(UISearchController *)searchController {
    [self fnResizeTableViewHeaderHeight];
}

3)根据搜索栏高度调整TableView标题高度 -

-(void) fnResizeTableViewHeaderHeight {
    CGFloat height = [searchController.searchBar systemLayoutSizeFittingSize:UILayoutFittingCompressedSize].height;

    UIView *headerView = self.table_view.tableHeaderView;

    CGRect frame = headerView.frame;

    frame.size.height = height;
    headerView.frame = frame;

    self.table_view.tableHeaderView = headerView;
}

答案 1 :(得分:1)

设置

searchController.hidesNavigationBarDuringPresentation = false
definesPresentationContext = false

这对我有用

答案 2 :(得分:0)

searchController.searchResultsUpdater = self
searchController.dimsBackgroundDuringPresentation = false
definesPresentationContext = false
searchController.searchBar.scopeButtonTitles = ["Groups", "People"]
tableView.tableHeaderView = searchController.searchBar
searchController.searchBar.delegate = self
searchController.searchBar.sizeToFit()
searchController.searchBar.barTintColor = darkGreen
searchController.searchBar.tintColor = yellow
searchController.searchBar.backgroundColor = darkGreen
tableView.sectionHeaderHeight = UITableViewAutomaticDimension

将definePresentationContext设置为false

答案 3 :(得分:0)

我遇到了完全相同的问题。它是由UITableView对顶部布局指南(导航栏)的约束引起的。导航栏向上滑动以显示搜索栏和/或范围按钮,它会随之拉动桌面的顶部。打破这个约束,你会发现搜索栏和范围按钮向上移动,但是表格第一行的顶部保持不变。现在你必须弄清楚如何约束表格,以便它在所有设备上都有一个不错的高度....

答案 4 :(得分:0)

当我经历过这种情况时,归结为我只能得出结论是一个错误。解决这个问题的唯一方法是以非常具体的方式设置布局:

  1. 确保将tableview放在所有其他视图的后面,即viewcontroller根视图中视图列表的顶部,如storyboard文件的文档大纲中所示。
  2. enter image description here

    1. 确保viewview的顶视图和viewcontroller根视图的上边距之间存在垂直距离约束。完全按照屏幕截图进行设置。如果两个视图的顺序相反,那么它将无法工作。如果约束是superview top而不是superview top margin,那么它将不起作用。如果约束是顶部布局指南,那么它将无效。
    2. enter image description here

      在我工作过的所有时间里,我从来没有经历过这样的事情,我很幸运,我有一个可以比较的工作项目,并最终弄清楚如何做到正确。

答案 5 :(得分:0)

对于iOS 11+,您应该查看此问题的答案https://stackoverflow.com/a/46436067/229688

基本上,这样做:

if #available(iOS 11.0, *) {
    self.navigationItem.searchController = searchController
    searchController?.hidesNavigationBarDuringPresentation = false
} else {
    tableView.tableHeaderView = searchController!.searchBar
}

答案 6 :(得分:0)

就我而言,设置范围按钮标题足以使范围栏显示,但搜索控件/表视图未正确初始化,并显示所有行,直到我插入

searchController.searchBar.showsScopeBar = true