UISearchController 搜索栏在活动时与第一个单元格重叠

Posted

技术标签:

【中文标题】UISearchController 搜索栏在活动时与第一个单元格重叠【英文标题】:UISearchController search bar overlap first cell when active 【发布时间】:2017-07-05 15:01:01 【问题描述】:

我正在使用UISearchController 在我的表格视图中搜索数据。我没有使用表格视图控制器。我想在搜索栏处于活动状态时隐藏导航栏,因此我将self.searchController.hidesNavigationBarDuringPresentation = YES; 设置为是。

但是,当我这样做并想要搜索时,我的活动搜索栏会覆盖第一个单元格的一部分。被覆盖的部分与状态栏的高度相同。

我尝试了与此类似的其他文章和问题,但没有任何帮助我解决它。然后我开始使用表格视图标题大小。我这样做了

 -(CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section

  return 20.0f;

结果是,当我点击搜索栏时,开始搜索问题不再存在。

但是,当搜索栏未激活时,搜索栏和第一个单元格之间存在间隙

任何想法如何解决这个问题?

编辑:添加self.automaticallyAdjustsScrollViewInsets = false;

【问题讨论】:

尝试在 viewDidLoad 中添加 self.automaticallyAdjustsScrollViewInsets = false 它从顶部隐藏了状态栏,但第一个单元格仍然被覆盖。 这很奇怪,应该不会影响状态栏的可见性。 【参考方案1】:

我设法通过将 RJiryes 答案与滚动到顶部相结合来解决此问题。

-(void)willPresentSearchController:(UISearchController *)searchController

     [self.contactsTableView setContentInset:UIEdgeInsetsMake(20, 0, 0, 0)];
     [self.contactsTableView setContentOffset:CGPointMake(0.0f, -self.contactsTableView.contentInset.top) animated:YES];
 

-(void)willDismissSearchController:(UISearchController *)searchController

     [self.contactsTableView setContentInset:UIEdgeInsetsMake(0, 0, 0, 0)];

【讨论】:

那是因为(我认为)您的搜索栏始终可见。一些实现建议在需要之前将其隐藏起来。在 viewdidload 中设置它时,您可能希望这样做。将移至下面的单独帖子。 为我工作,没有 setContentOffset 部分。【参考方案2】:

这就是我在 viewDidLoad 中设置搜索栏和内容的方式(复制自苹果的一些示例)。

它在显示未过滤数据的同一视图控制器中显示找到的结果。它还在表格标题中具有隐藏的搜索栏,直到需要它。

self.searchController = [[UISearchController alloc] initWithSearchResultsController:nil];
self.searchController.searchResultsUpdater = self;
self.tableView.tableHeaderView = self.searchController.searchBar;
[self.searchController.searchBar sizeToFit];

// we want to be the delegate for our filtered table so didSelectRowAtIndexPath is called for both tables
self.searchController.delegate = self;
self.searchController.dimsBackgroundDuringPresentation = NO; // default is YES
self.searchController.searchBar.delegate = self; // so we can monitor text changes + others

// Search is now just presenting a view controller. As such, the normal view controller
// presentation semantics apply. Namely, that presentation will walk up the view controller
// hierarchy until it finds the root view controller or one that defines a presentation context.
//
self.definesPresentationContext = YES;  // know where you want UISearchController to be displayed

// Hides search bar initially. When the user pulls down on the list, the search bar is revealed.
[self.tableView setContentOffset:CGPointMake(0, self.searchController.searchBar.frame.size.height)];

【讨论】:

要求:navigationItem.searchController = searchController,不要为我解决问题。【参考方案3】:

您可以从顶部添加内容插入而不是添加标题。

  self.tableView.contentInset = UIEdgeInsets(top: 20, left: 0, bottom: 0, right: 0)

当 willDismissSearchController(UISearchController 的委托方法)被调用时,将 insets 返回为 0

  self.tableView.contentInset = UIEdgeInsets(top: 0, left: 0, bottom: 0, right: 0)

这样,当空白不活动时,您将避免空白。

【讨论】:

这对我没有帮助 @beowulf 你是如何实现它的? 我确实将内容插入到 willPresentSearchController 中,并在 willDismissSearchController 中删除了它 然后呢?是不是把tableView的内容往下推了?究竟是什么问题?否则,任何人都很难在不提供更多细节的情况下“提供帮助”。 :-) 它没有把它往下推。看起来和第一张图片一样。只有在手动滚动表格视图后,我才能看到 contentInset。【参考方案4】:

不是最好的解决方案,只是解决方法。

-(CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section return searchController.isActive ? 20.0f : 0.0f;

【讨论】:

【参考方案5】:

我见过类似的行为。很可能,您的表视图控制器没有实现 heightForHeaderInSection。单元格的精确高度未知,这会导致像您这样的问题。

【讨论】:

我有两种方法来实现标题视图的高度和单元格的实现。【参考方案6】:

在解除 searchController 后重置 tableView.tableHeaderView = searchController.searchBar 为我解决了这个问题。

  public func didDismissSearchController(_ searchController: UISearchController) 
            tableView.tableHeaderView = searchController.searchBar

不幸的是,如果您选择结果并返回父视图控制器,didDismissSearchController 不会被调用。 在这种情况下,您需要将 searchBar.frame 重置回原点位置:

if let frame = tableView.tableHeaderView?.frame 
    searchController.searchBar.frame = frame

【讨论】:

【参考方案7】:

我也有同样的烦恼。研究没有回答。我的决定:

1) 我将 UITableviewController 与 SearchController 一起使用,当我在该字段上录制时,我遇到了这个 UI 问题: Extra blank space between searchBar and tableview 这些家伙指出,您需要将 searchController 与 UIViewcontroller 和 tableView 分开使用。 所以我做到了

2) 有这个问题。解决方法如下:

 let searchController = UISearchController(searchResultsController: nil)
var tableView:UITableView!

override func viewDidLoad() 
    super.viewDidLoad()

    loadData()
    setupTableView()
    setupSearchController()


private func setupTableView()

    tableView = UITableView(frame: CGRect.zero, style: .plain)

    **//next 2 very important line of code**

    tableView.autoresizingMask = UIViewAutoresizing()
    tableView.translatesAutoresizingMaskIntoConstraints = false
    view.addSubview(tableView)

    tableView.dataSource = self
    tableView.delegate = self
    tableView.register(LetterBrandCell.self, forCellReuseIdentifier: "brandCell")
    tableView.tableFooterView = UIView()
    addConstraints()

在添加约束的方法中,重要的是附加到top&bottomLayoutGuides,而不仅仅是查看:

private func addConstraints()

    NSLayoutConstraint(item: tableView,
                       attribute: .top,
                       relatedBy: .equal,
                       toItem: topLayoutGuide,
                       attribute: .bottom,
                       multiplier: 1,
                       constant: 0).isActive = true

    NSLayoutConstraint(item: tableView,
                       attribute: .bottom,
                       relatedBy: .equal,
                       toItem: bottomLayoutGuide,
                       attribute: .top,
                       multiplier: 1,
                       constant: 0).isActive = true
    NSLayoutConstraint(item: view,
                       attribute: .leading,
                       relatedBy: .equal,
                       toItem: tableView,
                       attribute: .leading,
                       multiplier: 1,
                       constant: 0).isActive = true
    NSLayoutConstraint(item: view,
                       attribute: .trailing,
                       relatedBy: .equal,
                       toItem: tableView,
                       attribute: .trailing,
                       multiplier: 1,
                       constant: 0).isActive = true


【讨论】:

以上是关于UISearchController 搜索栏在活动时与第一个单元格重叠的主要内容,如果未能解决你的问题,请参考以下文章

UISearchController 搜索栏在出现时向下移动

在 iOS 13 中使用 UISearchController 时,状态栏在 iOS 中变为白色

UISearchBar 在活动时与 UITableView 内容重叠

导航栏在搜索结果表视图中消失

UISearchController 的 UISearchBar 在活动时移出屏幕

iOS有没有办法在活动时将UISearchBar保留在TableviewHeader中