You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

iOS开发:如何消除searchBar与searchResultsController间空白并让结果控制器紧贴搜索栏

问题现象

开发过程中UISearchBar与searchResultsController展示时存在额外空白,效果如下:
异常空白效果1
异常空白效果2

现有实现代码
if #available(iOS 11, *) {
    let searchController = UISearchController(searchResultsController: ResultsController())
    searchController.searchBar.backgroundColor = UIColor.Custom.theme
    searchController.searchBar.delegate = self
    searchController.searchResultsUpdater = self
    navigationItem.searchController = searchController
    navigationItem.hidesSearchBarWhenScrolling = false
}
问题原因

iOS 11+ 将UISearchController关联到navigationItem后,系统会默认对searchResultsController的视图自动适配安全区域内边距,最终导致结果视图顶部出现多余空白。

解决方案
  • 方案1:在ResultsController的viewDidLoad方法中禁用自动内边距调整
override func viewDidLoad() {
    super.viewDidLoad()
    if #available(iOS 11.0, *) {
        // 清空额外安全区域内边距
        additionalSafeAreaInsets = .zero
        // 如果结果控制器根视图是滚动视图,禁用自动内边距调整
        if let scrollView = view as? UIScrollView {
            scrollView.contentInsetAdjustmentBehavior = .never
        }
    }
}
  • 方案2:修改现有初始化代码,新增属性配置
if #available(iOS 11, *) {
    let searchController = UISearchController(searchResultsController: ResultsController())
    searchController.searchBar.backgroundColor = UIColor.Custom.theme
    searchController.searchBar.delegate = self
    searchController.searchResultsUpdater = self
    // 新增配置:设置searchBar不透明,避免视图偏移计算异常
    searchController.searchBar.isTranslucent = false
    // 新增配置:设置当前控制器为上下文定义方,避免结果视图层级异常
    definesPresentationContext = true
    navigationItem.searchController = searchController
    navigationItem.hidesSearchBarWhenScrolling = false
}
  • 方案3:通过代理手动修正结果视图位置
    先为searchController设置代理:
    searchController.delegate = self
    再实现UISearchControllerDelegate代理方法:
func willPresentSearchController(_ searchController: UISearchController) {
    DispatchQueue.main.async {
        guard let resultsVC = searchController.searchResultsController else { return }
        let searchBarMaxY = self.navigationController?.navigationBar.frame.maxY ?? 0
        resultsVC.view.frame = CGRect(
            x: 0,
            y: searchBarMaxY,
            width: self.view.bounds.width,
            height: self.view.bounds.height - searchBarMaxY
        )
    }
}

内容的提问来源于stack exchange,提问作者aaajiulong

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.23 22:15:05