iOS 11 在首次展示搜索控制器后隐藏范围栏

Posted

技术标签:

【中文标题】iOS 11 在首次展示搜索控制器后隐藏范围栏【英文标题】:iOS 11 hides scope bar after first presentation of the search controller 【发布时间】:2017-11-16 00:22:22 【问题描述】:

我正在尝试使用 UISearchControllerios 11 中显示搜索栏和范围栏。

这是我用来设置搜索控制器的代码

let searchController = UISearchController(searchResultsController: nil)
searchController.delegate = self
navigationItem.searchController = searchController
navigationItem.hidesSearchBarWhenScrolling = false

searchController.searchResultsUpdater = self
searchController.dimsBackgroundDuringPresentation = false
searchController.searchBar.showsScopeBar = true
searchController.searchBar.scopeButtonTitles = ["1", "2", "3", "4"]
searchController.searchBar.delegate = self
definesPresentationContext = true

我想要一个带有始终可见的范围栏的搜索栏。 当视图控制器加载时,上面的代码可以正常工作,它会显示搜索栏和范围栏。

但是,一旦搜索控制器激活然后被关闭,iOS 会在搜索控制器关闭时隐藏范围栏,并且只显示搜索栏。

我尝试通过在didDismissSearchController 中添加以下代码来解决此问题,但是范围栏和搜索栏彼此重叠,而不是搜索栏下方的范围栏(如下图所示)。将此代码添加到searchBarTextDidBeginEditing(_ searchBar: UISearchBar)searchBarTextDidEndEditing(_ searchBar: UISearchBar) 无效。

searchController.searchBar.showsScopeBar = true
searchController.searchBar.sizeToFit()

【问题讨论】:

【参考方案1】:

    尝试将此添加到您的搜索控制器设置中:

    searchController.sizeToFit()
    

    然后添加这个:

    func searchBarShouldBeginEditing(_ searchBar: UISearchBar) -> Bool 
        self.searchBar.sizeToFit()
        return true
    
    
    func searchBarShouldEndEditing(_ searchBar: UISearchBar) -> Bool 
        self.searchBar.sizeToFit()
        return true
    
    

不要将searchController.searchBar.showsScopeBar = true 放在搜索栏功能中。出于某种原因,这会造成问题。

【讨论】:

以上是关于iOS 11 在首次展示搜索控制器后隐藏范围栏的主要内容,如果未能解决你的问题,请参考以下文章

搜索栏控制器 iOS 11 问题 - 搜索栏和范围按钮重叠

如何隐藏大标题 iOS 11 搜索控制器

为什么在首次启动时我的导航栏位于状态栏下

如何在首次加载应用程序时隐藏主弹出视图?

Swift ios11 NavigationItem SearchBar 不会完全隐藏

如何在 iOS 13 上最初隐藏导航控制器中的搜索栏?