Swift Xcode:UITableView添加搜索栏后底部出现额外空白如何解决?
解决UITableView添加搜索栏后底部出现额外空白的问题
我之前也遇到过一模一样的情况,大概率是因为搜索栏作为tableHeaderView时,自动布局在RTL(从右到左)场景下没有正确计算高度,或是UISearchController的部分属性间接干扰了tableView的contentSize。给你几个亲测有效的解决方案:
方案1:手动固定搜索栏frame,替代sizeToFit()
你当前使用的searchController.searchBar.sizeToFit()在RTL布局下有时无法准确计算高度,我们可以直接给搜索栏设置明确的尺寸:
// 替换原代码里的searchController.searchBar.sizeToFit() let searchBarHeight = searchController.searchBar.systemLayoutSizeFitting(UIView.layoutFittingCompressedSize).height searchController.searchBar.frame = CGRect(x: 0, y: 0, width: view.bounds.width, height: searchBarHeight)
完成后再将其设置为tableHeaderView即可。
方案2:在viewDidLayoutSubviews中更新表头布局
视图布局完成后,tableHeaderView的尺寸可能会发生偏移,我们可以在这个生命周期方法里重新校准:
override func viewDidLayoutSubviews() { super.viewDidLayoutSubviews() guard let headerView = tableOrder.tableHeaderView else { return } let newSize = headerView.systemLayoutSizeFitting(UIView.layoutFittingCompressedSize) if headerView.frame.size.height != newSize.height { headerView.frame.size = newSize tableOrder.tableHeaderView = headerView // 重新赋值触发tableView更新布局 } }
方案3:补充设置iOS13+的搜索控制器属性
如果你适配的是iOS13及以上系统,除了dimsBackgroundDuringPresentation,还需要关闭背景模糊属性,避免额外视图层级干扰:
if #available(iOS 13.0, *) { searchController.obscuresBackgroundDuringPresentation = false }
问题根源说明
在RTL布局下,sizeToFit()对UISearchBar的高度计算容易出现偏差,导致tableView误判表头高度,进而在底部预留出多余空白。另外,UISearchController的背景模糊相关属性,可能会在tableView下方生成隐藏视图,也会引发这个问题。
建议先尝试方案1,这是我当时解决问题的关键,如果不行再结合方案2和3一起调试。
内容的提问来源于stack exchange,提问作者Ben Shabat
相关产品推荐
相关产品推荐

