iOS 11:代码添加的SearchController搜索栏被截断问题(Objective-C)
解决UISearchController搜索栏被结果表视图遮挡的问题
这个问题我做项目时也踩过坑,多半是布局配置或者searchController的属性没设置到位,给你几个实用的解决思路:
1. 调整hidesNavigationBarDuringPresentation属性
这是最常见的原因——如果这个属性设为true,搜索时导航栏会隐藏,容易导致结果表视图往上顶,盖住搜索栏的下半部分。把它改成false,同时记得设置definesPresentationContext确保视图层级正确:
// 初始化你的搜索结果控制器 let resultsVC = YourSearchResultsTableViewController() let searchController = UISearchController(searchResultsController: resultsVC) // 关键配置 searchController.hidesNavigationBarDuringPresentation = false searchController.searchBar.delegate = self // 将搜索控制器添加到导航项 navigationItem.searchController = searchController // 确保搜索结果只在当前VC范围内显示 definesPresentationContext = true
2. 给结果表视图添加顶部内边距
如果结果表视图的起始位置刚好和搜索栏重叠,可以手动给它的tableView加上顶部内边距,留出搜索栏的高度空间:
// 在你的搜索结果控制器(YourSearchResultsTableViewController)的viewDidLoad中 override func viewDidLoad() { super.viewDidLoad() // 动态获取系统搜索栏的高度(也可以直接用44,但动态获取适配性更好) let searchBarHeight = UISearchBar().frame.height // 设置tableView的内容内边距 tableView.contentInset = UIEdgeInsets(top: searchBarHeight, left: 0, bottom: 0, right: 0) // 同步滚动指示器的内边距 tableView.scrollIndicatorInsets = tableView.contentInset }
3. 确认definesPresentationContext已正确设置
这个属性非常关键,它能保证搜索结果视图不会超出当前ViewController的边界显示。一定要在主ViewController(也就是添加searchController的那个VC)的viewDidLoad里设置:
override func viewDidLoad() { super.viewDidLoad() // 必须设置这个属性 definesPresentationContext = true // 后续初始化searchController的代码... }
4. 检查自定义SearchBar的布局约束
如果你用了自定义高度或者布局的SearchBar,要确保它的约束是正确的——比如顶部和导航栏底部对齐,或者高度约束没有被错误覆盖,导致结果表视图的起始位置计算错误。
先试试前三个方法,尤其是方法1和3,大部分情况下都能解决遮挡问题。
内容的提问来源于stack exchange,提问作者LS_
相关产品推荐
相关产品推荐

