如何隐藏UISearchController或缩小它?解决搜索栏空白问题
解决UISearchController隐藏后导航栏空白问题
你的问题核心在于:把UISearchController挂载到navigationItem后,导航栏会为搜索栏预留固定布局空间,即便你隐藏了searchBar,这个预留区域依然存在,因此出现空白。以下是几种可行的解决方法:
方法1:不关联导航栏(推荐)
如果不需要用户看到搜索栏,也不需要它占据导航栏位置,直接取消navigationItem与searchController的关联,仅初始化UISearchController处理后台搜索逻辑即可:
override func viewDidLoad() { initSearchController() } let searchController = UISearchController(searchResultsController: nil) func initSearchController() { searchController.searchResultsUpdater = self searchController.definesPresentationContext = true searchController.obscuresBackgroundDuringPresentation = false searchController.searchBar.enablesReturnKeyAutomatically = false searchController.searchBar.returnKeyType = .done // 移除导航栏关联代码 // navigationItem.searchController = searchController // navigationItem.hidesSearchBarWhenScrolling = false searchController.hidesNavigationBarDuringPresentation = false searchController.searchBar.isHidden = true searchController.searchBar.becomeFirstResponder() }
方法2:手动消除预留布局空间
如果必须将UISearchController关联到导航栏,可以通过以下两种方式消除空白:
隐藏搜索栏的父容器
func initSearchController() { // ... 原有初始化代码 ... searchController.searchBar.isHidden = true // 找到搜索栏的父容器并隐藏,直接消除预留布局空间 searchController.searchBar.superview?.isHidden = true searchController.searchBar.becomeFirstResponder() }
强制设置搜索栏高度为0
func initSearchController() { // ... 原有初始化代码 ... searchController.searchBar.isHidden = true // 强制覆盖默认布局,将搜索栏高度设为0 searchController.searchBar.heightAnchor.constraint(equalToConstant: 0).isActive = true searchController.searchBar.becomeFirstResponder() }
方法3:替换为纯后台搜索逻辑
如果完全不需要用户交互,仅需实现搜索功能,甚至可以不用UISearchController,直接编写自定义搜索逻辑,彻底规避视图布局带来的额外问题。
内容的提问来源于stack exchange,提问作者Patricio
相关产品推荐
相关产品推荐

