【问题标题】:UISearchBar scope buttons in UITableView Header hide the first row of the table viewUITableView Header 中的 UISearchBar 范围按钮隐藏表格视图的第一行
【发布时间】:2016-08-03 19:52:01
【问题描述】:

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

这是我添加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

如果您能告诉我如何修复此错误,我将不胜感激!

谢谢!

【问题讨论】:

  • 尝试设置definePresentationContext = false
  • 设置 definePresentationContext = false 似乎对我有用,尝试使用与您相同的代码。有关此标志的更多信息stackoverflow.com/questions/25445837/…
  • 我确实更改了 searchController。 definedPresentationContext = false 但没有任何改变!
  • 我将包含 searchController 的表视图控制器的定义PresentationContext 设置为 false.. 而不是 searchController.. 您在上面的代码中将其设置为 true
  • 你是对的,对不起。现在我刚刚添加了definesPresentationContext = false,但仍然无法正常工作。有任何想法吗?感谢您的帮助!

标签: ios xcode swift uitableview uisearchbar


【解决方案1】:

发生这种情况是因为 HeaderView 高度设置为 Searchbar 高度,最初为 44。但是,一旦您单击 Searchbar,Searchbar 就会以模态方式呈现并与 Scope 按钮一起移动到顶部,但底层 HeaderView 高度仍然相同,即 44 而不是 88(Searchbar 高度 + Scope 按钮高度)

对此我的处理方式是-

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;
}

【讨论】:

  • 解决了我的问题,恕我直言,这是唯一正确的方法:headerView 的高度确实是问题所在,因此此解决方案解决了根本问题。
  • 感谢您的帮助!
  • 虽然这可行,但我希望用户看不到重绘更正。 ios13
【解决方案2】:

设置

searchController.hidesNavigationBarDuringPresentation = false
definesPresentationContext = false

这对我有用

【讨论】:

  • searchController.hidesNavigationBarDuringPresentation 在 iOS 13 之前的版本中与范围按钮一起使用时出现错误。绝对将此标志设置为 false 可以缓解问题。从 iOS 13 开始,无论哪种方式都可以。
【解决方案3】:

在我的情况下,设置范围按钮标题足以让范围栏显示,但搜索控件/表格视图未正确初始化,并显示所有行,直到我插入

searchController.searchBar.showsScopeBar = true

【讨论】:

    【解决方案4】:
    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

    【讨论】:

    • 我确实将definesPresentationContext = true 更改为definesPresentationContext = false,但没有任何改变。无论如何感谢您的回复。还有其他想法吗?
    【解决方案5】:

    我遇到了完全相同的问题。这是由 UITableView 对顶部布局指南(导航栏)的约束引起的。导航栏向上滑动以显示搜索栏和/或范围按钮,并拉动表格顶部。打破该约束,您会发现搜索栏和范围按钮向上移动,但表格第一行的顶部保持不变。现在您只需要弄清楚如何约束表格,使其在所有设备上都具有合适的高度......

    【讨论】:

      【解决方案6】:

      当我遇到这种情况时,它归结为我只能得出的结论是一个错误。修复它的唯一方法是以非常具体的方式设置布局:

      1. 确保 tableview 放置在所有其他视图之后,即在 viewcontroller 根视图中的视图列表的顶部,如情节提要文件的文档大纲中所示。

      1. 确保 tableview 的顶部和 viewcontroller 的根视图的上边距之间存在垂直距离约束。完全按照屏幕截图进行设置。如果两个视图的顺序颠倒了,那就不行了。如果约束是超级视图顶部而不是超级视图顶部边距,那么它将不起作用。如果约束是顶部布局指南,那么它将不起作用。

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

      【讨论】:

        【解决方案7】:

        对于 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
        }
        

        【讨论】:

          猜你喜欢
          • 2018-05-11
          • 2011-12-03
          • 1970-01-01
          • 2018-06-16
          • 1970-01-01
          • 2012-01-19
          • 1970-01-01
          • 1970-01-01
          • 2019-08-03
          相关资源
          最近更新 更多