应用搜索过滤器后,我们希望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标题上方出现以下灰色区域:
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中的文档大纲是:
如果单元格首先滚动到某个特定点,那么解决方案是否会将一个置于搜索结果的顶部,而不会产生TableView标题视图上方灰色区域的副作用或使其失败?谢谢。
答案 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
不会生效。添加beginUpdates
和endUpdates
也是如此。