【问题标题】:Strange white space at UITableView header when using UISearchController with UITableViewController on iOS 10在 iOS 10 上将 UISearchController 与 UITableViewController 一起使用时,UITableView 标头出现奇怪的空白
【发布时间】:2017-01-12 02:59:42
【问题描述】:

空白仅出现在 iOS 10 上。

【问题讨论】:

    标签: uitableview uisearchcontroller ios10


    【解决方案1】:

    基于@yishus 的回答:https://stackoverflow.com/a/39871273/4405051

    我也遇到了这个问题。如果您启用了垂直滚动指示器,您应该能够看到这是UIScrollView 的插入问题。而且似乎只有当您使用UITableViewcontroller 作为UISearchControllersearchResultsController 时才会发生这种情况。

    这个额外的空间在视图的顶部和底部都可见。

    这个答案不是很好,但我现在添加这个。

    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 被调用。由于我异步加载结果,这对性能非常不利。

    【讨论】:

      【解决方案2】:

      我尝试了另一种似乎对我有用的方法。对于您应用的主要目标,将“隐藏状态栏”设置为 true。至少对我来说(Xcode 8 GM 种子),这实际上并没有隐藏应用程序中的状态栏,但似乎已经纠正了间距问题。

      虽然这为我解决了手机垂直放置时的问题,但并没有完全解决水平放置时的间距问题。这段代码还解决了水平对齐屏幕上的问题:

          override var prefersStatusBarHidden: Bool {
              get {
                  return UIApplication.shared.isStatusBarHidden
              }
          }
      

      当然,将 prefersStatusBarHidden 值设置为 false 将完全禁用状态栏,但这对于某些开发人员来说可能不是可行的解决方法。

      希望这会有所帮助。这有点小题大做,我希望 Apple 在未来的 iOS 更新中解决这个问题。

      【讨论】:

        【解决方案3】:

        我也遇到了这个问题。如果您启用了垂直滚动指示器,您应该能够看到这是UIScrollView 的插入问题。似乎只有当您使用UITableViewcontroller 作为UISearchControllersearchResultsController 时才会发生这种情况。

        这个额外的空间在视图的顶部和底部都可见。

        这个答案不是很好,但我现在添加这个。

        if #available(iOS 10.0, *) {
            automaticallyAdjustsScrollViewInsets = false
            tableView.contentInset = UIEdgeInsetsMake(64, 0, 44, 0)
        }
        

        【讨论】:

          【解决方案4】:

          最后,我找到了最简单的解决方案:

          automaticallyAdjustsScrollViewInsets = false
          

          ??

          【讨论】:

          • 我在 searchController 和 searchResultsController 中都添加了 automaticAdjustsScrollViewInsets=false,但与 iOS 10 仍有差距。
          【解决方案5】:

          您将 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? ⬇️"
              }
          }
          ...
          

          【讨论】:

          • 谢谢巴勃罗!你是最棒的! ??
          • 当您希望搜索控制器对搜索结果有单独的视图时,这无济于事。这个差距出现在 iOS 10 中,而不是 iOS 7-9。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-10-26
          • 2013-08-29
          • 2021-10-18
          • 2015-05-19
          • 1970-01-01
          • 2016-05-08
          相关资源
          最近更新 更多