滚动到顶部,估计的单元格高度

时间:2014-02-07 14:43:01

标签: ios uitableview uiscrollview

通过实施UITableView使用估算的单元格高度,将tableView:estimatedHeightForRowAtIndexPath:滚动到顶部的正确方法是什么?

我注意到,如果有足够的估算错误,通常的方法不一定滚动到顶部。

[self.tableView setContentOffset:CGPointMake(0, 0 - self.tableView.contentInset.top) animated:animated];

4 个答案:

答案 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
}];
  1. 滚动到estimatedHeightForRowAtIndexPath
  2. 计算的偏移量
  3. setContentOffsetZero
  4. 来自https://github.com/caoimghgin/TableViewCellWithAutoLayout/issues/13

    的灵感

答案 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)