iOS开发:如何消除searchBar与searchResultsController间空白并让结果控制器紧贴搜索栏
问题现象
开发过程中UISearchBar与searchResultsController展示时存在额外空白,效果如下:

现有实现代码
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
相关产品推荐
相关产品推荐

