iOS 11集成UISearchBar时SearchResultsController遮挡全屏问题
我之前也踩过iOS 11 UISearchController这个坑!问题根源在于iOS 11对搜索控制器的集成逻辑做了调整,尤其是当绑定到navigationItem时,默认的展示行为会让结果控制器全屏覆盖,连搜索栏都被挡住,导致无法触发取消操作。下面是针对性的解决方案,结合你的最小示例来调整:
解决iOS 11 UISearchResultsController遮挡全屏问题
1. 修正结果控制器的展示样式
默认情况下,搜索结果控制器的modalPresentationStyle可能被设为.fullScreen,这会让它覆盖整个屏幕(包括导航栏和搜索栏)。你需要把它改成.currentContext,让它只覆盖当前页面内容,保留导航栏区域:
// 初始化搜索结果控制器时添加这行 let searchResultsVC = TableViewController() searchResultsVC.modalPresentationStyle = .currentContext
2. 禁用搜索时隐藏导航栏
iOS 11的UISearchController默认会在搜索时隐藏导航栏,这也是导致搜索栏被遮挡的原因之一。需要手动关闭这个特性:
let searchController = UISearchController(searchResultsController: searchResultsVC) searchController.hidesNavigationBarDuringPresentation = false
3. 正确绑定搜索控制器到导航栏
确保你是通过navigationItem.searchController来设置搜索控制器(iOS 11推荐的集成方式),而不是手动添加到tableHeaderView,避免层级混乱:
override func viewDidLoad() { super.viewDidLoad() // 初始化并配置结果控制器 let searchResultsVC = TableViewController() searchResultsVC.modalPresentationStyle = .currentContext searchResultsVC.tableView.register(UITableViewCell.self, forCellReuseIdentifier: reuseid) // 配置搜索控制器 let searchController = UISearchController(searchResultsController: searchResultsVC) searchController.searchResultsUpdater = self searchController.hidesNavigationBarDuringPresentation = false // 可选:设置搜索栏占位符 searchController.searchBar.placeholder = "搜索内容..." // 绑定到导航栏 navigationItem.searchController = searchController // 可选:让搜索栏始终显示在导航栏,不随滚动隐藏 navigationItem.hidesSearchBarWhenScrolling = false }
4. 优化结果控制器的视觉层级
如果你的结果控制器tableView背景不透明,也会看起来完全遮挡下方内容,可以设置半透明背景,让用户知道搜索栏依然存在:
class TableViewController: UITableViewController, UISearchResultsUpdating { override func viewDidLoad() { super.viewDidLoad() tableView.backgroundColor = UIColor.systemBackground.withAlphaComponent(0.95) } func updateSearchResults(for searchController: UISearchController) { // 这里写你的搜索逻辑,比如根据输入过滤数据并刷新tableView } }
把这些修改应用到你的代码后,点击搜索栏输入时,结果控制器会在搜索栏下方展示,不会遮挡导航栏和搜索栏,你可以正常点击搜索栏的取消按钮关闭搜索状态。
内容的提问来源于stack exchange,提问作者Richard Topchii
相关产品推荐
相关产品推荐

