为啥我的 UITableView 滚动偏移在返回其视图时最终落在 UISearchController 后面?

Posted

技术标签:

【中文标题】为啥我的 UITableView 滚动偏移在返回其视图时最终落在 UISearchController 后面?【英文标题】:Why does my UITableView scroll offset end up behind the UISearchController when returning to its view?为什么我的 UITableView 滚动偏移在返回其视图时最终落在 UISearchController 后面? 【发布时间】:2019-10-17 07:49:32 【问题描述】:

Xcode 11.1、ios 13.1

我很难弄清楚为什么 TableView 单元格最终会出现在搜索栏后面。

我的设置:

override func viewDidLoad() 
    // Setup Eureka's UITableViewStyle to `Plain`  (like 'Contacts' app)
    // https://github.com/xmartlabs/Eureka/issues/218
    if tableView == nil 
        tableView = UITableView(frame: view.bounds, style: UITableView.Style.plain)
        tableView?.autoresizingMask = UIView.AutoresizingMask.flexibleWidth.union(.flexibleHeight)
        tableView.cellLayoutMarginsFollowReadableWidth = false
    
    // *now* call super.
    super.viewDidLoad()

    // Add search bar
    searchController.searchResultsUpdater = self
    searchController.obscuresBackgroundDuringPresentation = false
    definesPresentationContext = true

    // Place the search bar in the navigation bar.
    self.navigationItem.searchController = self.searchController
    self.navigationItem.hidesSearchBarWhenScrolling = false

【问题讨论】:

请展示您如何设置 tableView 的约束。您需要将 tableView 的 topAnchor 设置为 safeAreaTopAnchor @EneaDume 这个VC是程序化创建的,我其实没有配置任何约束。 我们需要看看tableView是如何创建的 如何在VC上添加这个tableView @EneaDume 它只是继承而来,因为我正在使用为我设置 UITableView 和单元格的Eureka 框架。 github.com/xmartlabs/Eureka 【参考方案1】:

tableView = UITableView(frame: view.bounds, style: UITableView.Style.plain)之后添加以下约束

tableView.translatesAutoresizingMaskIntoConstraints = false
tableView.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor, constant: 0).isActive = true
tableView.leadingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.leadingAnchor, constant: 0).isActive = true
tableView.trailingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.trailingAnchor, constant: 0).isActive = true
tableView.bottomAnchor.constraint(equalTo: view.safeAreaLayoutGuide.bottomAnchor, constant: 0).isActive = true

【讨论】:

*** Terminating app due to uncaught exception 'NSGenericException', reason: 'Unable to activate constraint with anchors <NSLayoutYAxisAnchor:0x60000077cd00 "UITableView:0x7fdeb0873000.top"> and <NSLayoutYAxisAnchor:0x600000776600 "UILayoutGuide:0x600002742060'UIViewSafeAreaLayoutGuide'.top"> because they have no common ancestor. Does the constraint or its anchors reference items in different view hierarchies? That's illegal.' 我改用:tableView.tableHeaderView = searchController.searchBar,并在viewWillLayoutSubviews 中添加了您的代码。将搜索栏放在导航栏中变得太成问题了。 navigationItem.searchController = searchController 应该可以工作。【参考方案2】:

在 iOS 12 和 13 上进行了无数次测试后,因为我得到了不同的 UX 结果,我发现了这个:https://***.com/a/57861125/7599

结果:(使用Snapkit)

extendedLayoutIncludesOpaqueBars = true

    self.tableView.snp.remakeConstraints  make -> Void in
        make.top.equalToSuperview()
        make.leading.equalTo(self.view.safeAreaLayoutGuide.snp.leading)
        make.trailing.equalTo(self.view.safeAreaLayoutGuide.snp.trailing)
        make.bottom.equalToSuperview()
    

【讨论】:

以上是关于为啥我的 UITableView 滚动偏移在返回其视图时最终落在 UISearchController 后面?的主要内容,如果未能解决你的问题,请参考以下文章

为啥当我滚动浏览 UITableView 时图像会不断调整大小?

设置 UITableView 的内容偏移在滚动时不起作用

为啥我的 UITableView 单元格在滚动时重叠?

为啥我的 UITableView 没有出现在正确的滚动位置?

我的 UITableView 不会向下滚动到数据的末尾!为啥?

为啥我的子类 UItableView 不滚动?