在iOS 10上使用带有UITableViewController的UISearchController时,UITableView标头上的奇怪空白区域

时间:2016-09-04 15:50:06

标签: uitableview uisearchcontroller ios10

空白区域仅显示在iOS 10上。

iOS10HeaderBug

5 个答案:

答案 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? ⬇️"
    }
}
...

No more whitespace!

答案 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