【发布时间】:2017-01-12 02:59:42
【问题描述】:
【问题讨论】:
标签: uitableview uisearchcontroller ios10
【问题讨论】:
标签: uitableview uisearchcontroller ios10
基于@yishus 的回答:https://stackoverflow.com/a/39871273/4405051
我也遇到了这个问题。如果您启用了垂直滚动指示器,您应该能够看到这是
UIScrollView的插入问题。而且似乎只有当您使用UITableViewcontroller作为UISearchController的searchResultsController时才会发生这种情况。这个额外的空间在视图的顶部和底部都可见。
这个答案不是很好,但我现在添加这个。
if #available(iOS 10.0, *) { automaticallyAdjustsScrollViewInsets = false tableView.contentInset = UIEdgeInsetsMake(64, 0, 44, 0) }
我禁用了垂直滚动指示器,但问题仍然存在。此外,您不能使用#available 来检查 iOS 版本。它用于检查 iOS 版本中的 API 是否可用。所以我最终使用了这个解决方案:
在搜索结果控制器(不是主视图控制器)中:
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。
还有一个问题,每次主视图控制器出现(从另一个标签栏切换,弹出视图控制器,...),updateSearchResults 被调用。由于我异步加载结果,这对性能非常不利。
【讨论】:
我尝试了另一种似乎对我有用的方法。对于您应用的主要目标,将“隐藏状态栏”设置为 true。至少对我来说(Xcode 8 GM 种子),这实际上并没有隐藏应用程序中的状态栏,但似乎已经纠正了间距问题。
虽然这为我解决了手机垂直放置时的问题,但并没有完全解决水平放置时的间距问题。这段代码还解决了水平对齐屏幕上的问题:
override var prefersStatusBarHidden: Bool {
get {
return UIApplication.shared.isStatusBarHidden
}
}
当然,将 prefersStatusBarHidden 值设置为 false 将完全禁用状态栏,但这对于某些开发人员来说可能不是可行的解决方法。
希望这会有所帮助。这有点小题大做,我希望 Apple 在未来的 iOS 更新中解决这个问题。
【讨论】:
我也遇到了这个问题。如果您启用了垂直滚动指示器,您应该能够看到这是UIScrollView 的插入问题。似乎只有当您使用UITableViewcontroller 作为UISearchController 的searchResultsController 时才会发生这种情况。
这个额外的空间在视图的顶部和底部都可见。
这个答案不是很好,但我现在添加这个。
if #available(iOS 10.0, *) {
automaticallyAdjustsScrollViewInsets = false
tableView.contentInset = UIEdgeInsetsMake(64, 0, 44, 0)
}
【讨论】:
最后,我找到了最简单的解决方案:
automaticallyAdjustsScrollViewInsets = false
??
【讨论】:
您将 UITableViewController 设置为 UISearchController 的 searchResultsController 但没有自动布局也没有框架。
正如您在 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? ⬇️"
}
}
...
【讨论】: