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

Swift中如何在ViewController加载时始终显示导航栏中的SearchBar?

让UISearchController搜索栏始终固定在导航栏的解决办法

关键原理

默认iOS的UISearchController会在滚动列表时自动把搜索栏收起来,要让它一直显示,核心就是修改导航栏和搜索控制器的两个关键属性。

具体操作步骤

1. 初始化时设置搜索控制器属性

创建UISearchController的时候,加上这几个配置:

let searchController = UISearchController(searchResultsController: nil)
// 禁止搜索栏在搜索时隐藏导航栏
searchController.hidesNavigationBarDuringPresentation = false
// 把搜索栏绑定到导航栏
navigationItem.searchController = searchController
// 重点:强制搜索栏始终显示,滚动时不隐藏
navigationItem.hidesSearchBarWhenScrolling = false

2. 适配大标题(如果用了的话)

如果你的页面用了导航栏大标题,还要确保大标题的显示模式不会影响搜索栏:

// 开启大标题(如果需要)
navigationController?.navigationBar.prefersLargeTitles = true
// 当前页面始终显示大标题,避免滚动时收缩导致搜索栏被带跑
navigationItem.largeTitleDisplayMode = .always

要是不用大标题,直接把largeTitleDisplayMode设为.never就行,核心还是hidesSearchBarWhenScrolling = false这个属性必须设为false。

3. 处理列表滚动的小问题

如果设置后列表内容被导航栏挡住,或者滚动还是有异常,调整列表的适配行为:

// 让系统自动适配导航栏和状态栏高度,避免内容被遮挡
collectionView.contentInsetAdjustmentBehavior = .automatic

踩坑排查点

  • 别在其他地方(比如滚动代理方法里)动态改hidesSearchBarWhenScrolling的值,不然会覆盖设置
  • 如果是自定义导航栏,检查有没有重写滚动相关的方法,不小心把搜索栏弄隐藏了
  • 一定要把搜索控制器赋值给navigationItem.searchController,别自己手动把搜索栏加到导航栏子视图里,那样容易出问题

内容的提问来源于stack exchange,提问作者Kazi Tanjim Shakib

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 07:25:03