通过实施UITableView
使用估算的单元格高度,将tableView:estimatedHeightForRowAtIndexPath:
滚动到顶部的正确方法是什么?
我注意到,如果有足够的估算错误,通常的方法不一定滚动到顶部。
[self.tableView setContentOffset:CGPointMake(0, 0 - self.tableView.contentInset.top) animated:animated];
答案 0 :(得分:1)
我遇到了类似的问题(我没有尝试手动将tableview滚动到顶部但是在点击状态栏时视图无法正确滚动。)
我想出解决这个问题的唯一方法就是确保在tableView:estimatedHeightForRowAtIndexPath:
方法中,如果您知道,则返回实际高度。
我的实现缓存了调用tableView:heightForRowAtIndexPath:
以提高效率的结果,因此我只是在估算中查找此缓存,看看我是否已经知道真正的高度。
我认为问题来自tableView:estimatedHeightForRowAtIndexPath:
优先于tableView:heightForRowAtIndexPath:
被调用,即使向上滚动已经渲染的单元格也是如此。只是一个猜测。
答案 1 :(得分:0)
这段代码怎么样
[UIView animateWithDuration:0.0f animations:^{
[_tableView scrollRectToVisible:CGRectMake(0, 0, 1, 1) animated:NO]; //1
} completion:^(BOOL finished) {
_tableView.contentOffset = CGPointZero; //2
}];
答案 2 :(得分:0)
tableView.scrollToRow
怎么样?为我解决了这个问题。
Swift 3示例:
tableView.scrollToRow(at: IndexPath(row: 0, section: 0), at: .top, animated: true)
答案 3 :(得分:0)
let point = { () -> CGPoint in
if #available(iOS 11.0, *) {
return CGPoint(x: -tableView.adjustedContentInset.left, y: -tableView.adjustedContentInset.top)
}
return CGPoint(x: -tableView.contentInset.left, y: -tableView.contentInset.top)
}()
for section in (0..<tableView.numberOfSections) {
if 0 < tableView.numberOfRows(inSection: section) {
// Find the cell at the top and scroll to the corresponding location
tableView.scrollToRow(at: IndexPath(row: 0, section: section),
at: .none,
animated: true)
if tableView.tableHeaderView != nil {
// If tableHeaderView != nil then scroll to the top after the scroll animation ends
CATransaction.setCompletionBlock {
tableView.setContentOffset(point, animated: true)
}
}
return
}
}
tableView.setContentOffset(point, animated: true)