UISearchController 搜索栏与 CollectionView 重叠

Posted

技术标签:

【中文标题】UISearchController 搜索栏与 CollectionView 重叠【英文标题】:UISearchController searchbar overlaps CollectionView 【发布时间】:2017-06-13 12:40:00 【问题描述】:

以编程方式启动 UISearchController 时,UISearchBar 与下面的 CollectionView 重叠。

我到处搜索,似乎以前没有人遇到过这种问题。

我能做和不能做有一些限制:

不能使用表格视图标题 不能使用collectionview header 必须使用collectionviewcontroller

已经尝试过调整滚动视图插入和扩展边缘 - 没有用,因为它是 CollectionViewController

问题是:如何以正确的方式使用 IBAction? 连接放大镜的IBAction代码为:

@IBAction func showSearchBar(_ sender: UIBarButtonItem) 
    let searchController = UISearchController(searchResultsController: nil)
    searchController.searchResultsUpdater = self
    searchController.dimsBackgroundDuringPresentation = false
    present(searchController, animated: true, completion: nil)

【问题讨论】:

我记得 UISearchController 有一个委托方法,类似于 becomeActive。您是否尝试过在该方法中更改 collectionView 的插图? 这看起来一点都不正确...你怎么有两个状态栏?你能创建一个重现这个结果的小项目吗? 这些不是状态栏,而是顶部栏。当 UISearchController 被调用时,如上面的代码,它将标准的 Top Bar 替换为 UISearchBar 接口。一旦 UISearchBar 被 Cancel 按钮关闭,标准的 Top Bar 就回来了。 【参考方案1】:

感谢@noir_eagle 的建议,我已经为present(searchController, animated: true, completion: nil) 方法实现了完成块,所以它看起来像这样:

present(searchController, animated: true, completion: 
        UIView.animate(withDuration: 0.25, animations: 
            self.collectionView?.contentInset = UIEdgeInsets(top: 64, left: 0, bottom: 0, right: 0)
            self.collectionView?.contentOffset = CGPoint(x: 0, y: -64)
        )
    )

我不得不在这个方法中这样做,因为 UISearchControllerDelegate 方法 didPresentSearchController(_ searchController: UISearchController)willPresentSearchController(_ searchController: UISearchController) 永远不会被调用......不知道为什么。

接下来,不知何故,UISearchControllerDelegate 的方法 didDismissSearchController(_ searchController: UISearchController) 在使用 Cancel 按钮关闭 UISearchBar 后立即被调用,所以我实现了这个:

func didDismissSearchController(_ searchController: UISearchController) 
    UIView.animate(withDuration: 0.25, animations: 
        self.collectionView?.contentInset = UIEdgeInsets(top: 64, left: 0, bottom: 0, right: 0)
    )

这很好...流畅的动画,直到我意识到属性searchController.hidesNavigationBarDuringPresentationtrue,所以我所要做的就是将它设置为false强>。

就是这样,不需要contentInsetcontentOffset 动画! 最终解决方案如下所示:

@IBAction func showSearchBar(_ sender: UIBarButtonItem) 
    let searchController = UISearchController(searchResultsController: nil)
    searchController.searchResultsUpdater = self
    searchController.dimsBackgroundDuringPresentation = false
    searchController.hidesNavigationBarDuringPresentation = false
    present(searchController, animated: true, completion: nil)

【讨论】:

以上是关于UISearchController 搜索栏与 CollectionView 重叠的主要内容,如果未能解决你的问题,请参考以下文章

如何用目标 c 实现 UISearchController

ViewContoller 顶部的搜索栏与 UITableView 并重新加载数据

如何修复表格视图的搜索栏与状态栏重叠

颤振搜索栏与带有firestore的块

SwiftUI 搜索栏与导航栏一致

在 iOS7 中将搜索栏与导航栏结合时 UISearchbar 空间为空?