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
相关产品推荐
相关产品推荐

