答案 0 :(得分:5)
我也遇到了这个问题。如果启用了垂直滚动指示器,您应该能够看到它是UIScrollView
的插入问题。并且似乎只有当您使用UITableViewcontroller
作为searchResultsController
的{{1}}时才会发生这种情况。
这个额外的空间在视图的顶部和底部都可见。
这个答案并不漂亮,但我现在正在添加它。
UISearchController
答案 1 :(得分:2)
您将UITableViewController设置为UISearchController的searchResultsController,但没有Autolayout,也没有框架。
正如您可以在UISearchController的快速帮助中阅读的那样,如果要在显示可搜索内容的同一视图控制器中显示搜索结果,则可以将其传递为nil。
如果您将代码设置为这样,那么您的代码看起来会没问题:
class ViewController: UIViewController {
let searchController = UISearchController(searchResultsController: nil)
override func viewDidLoad() {
super.viewDidLoad()
let tableView = UITableView(frame: view.bounds, style: .plain)
tableView.dataSource = self
view.addSubview(tableView)
searchController.hidesNavigationBarDuringPresentation = false
searchController.dimsBackgroundDuringPresentation = false
navigationItem.titleView = searchController.searchBar
searchController.searchBar.becomeFirstResponder()
searchController.searchBar.text = "⬇️ What is this white space? ⬇️"
}
}
...
答案 2 :(得分:2)
根据@yishus回答:https://stackoverflow.com/a/39871273/4405051
我也遇到了这个问题。如果启用了垂直滚动指示器,您应该能够看到它是
UIScrollView
的插入问题。并且似乎只有当您使用UITableViewcontroller
作为searchResultsController
的{{1}}时才会发生这种情况。这个额外的空间在视图的顶部和底部都可见。
这个答案并不漂亮,但我现在正在添加它。
UISearchController
我禁用垂直滚动指示器,但问题仍然存在。此外,您无法使用if #available(iOS 10.0, *) {
automaticallyAdjustsScrollViewInsets = false
tableView.contentInset = UIEdgeInsetsMake(64, 0, 44, 0)
}
来检查iOS版本。它用于检查iOS版本中 API是否可用。所以我最终使用了这个解决方案:
在搜索结果控制器(不是主视图控制器)中:
#available
在主视图控制器中更新搜索结果时:
override func viewDidLoad() {
super.viewDidLoad()
if ProcessInfo().isOperatingSystemAtLeast(OperatingSystemVersion(majorVersion: 10,
minorVersion: 0,
patchVersion: 0)) {
automaticallyAdjustsScrollViewInsets = false
}
}
func updateSearchResults(for searchController: UISearchController) {
if ProcessInfo().isOperatingSystemAtLeast(OperatingSystemVersion(majorVersion: 10,
minorVersion: 0,
patchVersion: 0)) {
searchResultsController.tableView.contentInset = UIEdgeInsets(top: topLayoutGuide.length,
left: 0,
bottom: bottomLayoutGuide.length,
right: 0)
}
// Filter results here
}
是上面提到的控制器。
如果您想要处理方向,请在方向更改时再次设置searchResultsController
。
然而,还有一个问题,每当主视图控制器出现时(从另一个标签栏切换,弹出一个视图控制器......),就会调用searchResultsController.tableView.contentInset
。由于我以异步方式加载结果,因此性能非常差。
答案 3 :(得分:1)
我尝试了一种似乎对我有用的不同方法。对于您应用的主要目标,请设置"隐藏状态栏"为真。至少对我来说(Xcode 8 GM种子)这实际上并没有隐藏应用程序中的状态栏,但似乎已经纠正了间距问题。
虽然当手机垂直定向时这解决了我的问题,但是当水平定向时它并没有完全解决间距问题。这段代码还解决了水平对齐屏幕上的问题:
override var prefersStatusBarHidden: Bool {
get {
return UIApplication.shared.isStatusBarHidden
}
}
当然,将prefersStatusBarHidden值设置为false将完全禁用状态栏,但对于某些开发人员而言,这可能不是一种可行的解决方法。
希望这会有所帮助。这有点像黑客,我希望Apple在未来的iOS更新中解决这个问题。
答案 4 :(得分:0)
最后,我找到了最简单的解决方案:
automaticallyAdjustsScrollViewInsets = false