如何修复滚动到UITableView的顶部所以它不是多病的?

时间:2018-03-14 02:43:34

标签: ios uitableview uiscrollview

应用搜索过滤器后,我们希望TableView滚动到结果的顶部。我们有一个随内容滚动的TableView标题。因此,top意味着我们希望看到TableView标头以及前几个单元格。 我找到了以下内容并尝试了一些针对iOS 10和iOS 11的解决方案:UITableView - scroll to the top但是,我们一直在遇到错误。

例如,我们尝试应用scrollRectToVisible解决方案,例如:

self.tableView.scrollRectToVisible(CGRect(x: 0, y: 0, width: 1, height: 1), animated: true)

然而,在应用滤镜三次后,有时会在TableView标题上方出现以下灰色区域:

gray area

Programmatically scroll a UIScrollView to the top of a child UIView (subview) in Swift中TableView标题解决方案的scrollToView具有相同的灰色区域效果。

另一种方法也产生了灰色区域:

UIView.animate(withDuration: 0.25) {
    self.tableView.setContentOffset(CGPoint.zero, animated: false)
}

所以,我们尝试了setContentOffset解决方案,例如:

if #available(iOS 11.0, *) {
    tableView.beginUpdates()
    tableView.setContentOffset(CGPoint(x: 0, y: -tableView.adjustedContentInset.top), animated: true)
    tableView.endUpdates()

} else {
    tableView.beginUpdates()
    tableView.setContentOffset(CGPoint(x: 0, y: -tableView.contentInset.top), animated: true)
    tableView.endUpdates()
}

然而,有一种情况似乎不会让用户一直走到顶端,例如:https://youtu.be/OmWCk5PedJE我不是积极的,但也许它与细胞有关在顶部稍微。

应该注意的是,TableView是一种分组样式,因此HeaderView将向上和向外滚动。我们使用了一个大的estimatedRowHeight(数量很大的800),rowHeight被设置为UITableViewAutomaticDimension。

Interface Builder中的文档大纲是:

document outline

如果单元格首先滚动到某个特定点,那么解决方案是否会将一个置于搜索结果的顶部,而不会产生TableView标题视图上方灰色区域的副作用或使其失败?谢谢。

1 个答案:

答案 0 :(得分:1)

修复是明确的tableView(_:heightForRowAt:)我们还删除了TableView的estimatedRowHeight和rowHeight的赋值。

所以我们添加了这段代码:

override func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {

    return UITableViewAutomaticDimension
}

并使用another StackOverflow post中的代码滚动到顶部:

    if #available(iOS 11.0, *) {
        tableView.beginUpdates()
        tableView.setContentOffset(CGPoint(x: 0, y: -tableView.adjustedContentInset.top), animated: true)
        tableView.endUpdates()

    } else {
        tableView.beginUpdates()
        tableView.setContentOffset(CGPoint(x: 0, y: -tableView.contentInset.top), animated: true)
        tableView.endUpdates()
    }

已删除此代码:

    self.tableView.estimatedRowHeight = 800
    self.tableView.rowHeight = UITableViewAutomaticDimension

信不信由你,删除self.tableView.estimatedRowHeight = 800是让事情发挥作用的关键。如果我们把它留在那里,似乎setContentOffset不会生效。添加beginUpdatesendUpdates也是如此。