iOS:scrollToRowAtIndexPath没有为最后一页显示正确的顶部索引路径

时间:2013-07-21 15:45:03

标签: ios uitableview scrollview nsindexpath

我正在尝试以编程方式滚动tableview,如下所示。请注意,我已经增加了内容大小,因此我可以看到剩下的最后几行。我可以正确地手动滚动以获得所需的索引路径,但是在程序上它没有发生。

[tableview reloadData];

CGSize size = tableview.contentSize;
size.height += 1000;
tableview.contentSize = size;

int rows = [tableview numberOfRowsInSection:0];
int numberofRowsInView = 17;
for (int i = 0; i < ceil((float)rows/numberofRowsInView); i++) {
    [tableview scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:i * numberofRowsInView inSection:0] atScrollPosition:UITableViewScrollPositionTop animated:NO];
    ....
}

对于总行60,我希望此代码返回0-16,17-33,34-50,51-59的单元格视图,但是对于最后一个滚动,它返回43-59,即完整的17行视图,同时基于在上面的代码中,最后一页的顶部索引路径应为51!

有人可以帮我解决这个问题。感谢。

这是手动滚动图片:

Manually scrolling

这是以编程方式完成的:

Programmatically scrolling

2 个答案:

答案 0 :(得分:1)

如果屏幕上有17行,则无法滚动,因此显示的项目少于17个。因此,表视图将使您请求的行位于顶部并滚动到最近的行,这意味着视图是“完整”的行。基本上是因为60不能(完全)被17整除,所以表视图不会让你只显示半页'。


或者,您可以尝试使用基于顶部(setContentOffset:animated:)所需单元格框架的滚动视图方法rectForRowAtIndexPath:

答案 1 :(得分:0)

似乎我不会让这个工作。我需要最后一页单元格只有一小部分时间,然后我重置回原来的tableview框架。

int rows = [tableview numberOfRowsInSection:0];
int numberofRowsInView = 17;

for (int i = 0; i < ceil((float)rows/numberofRowsInView); i++) {
    NSUInteger remainingCells = rows - i*numberofRowsInView;
    if(remainingCells < numberofRowsInView) {
        CGRect frame = tableview.frame;
        frame.size.height = remainingCells * tableview.rowHeight;
        tableview.frame = frame;
    }

    [tableview scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:i * numberofRowsInView inSection:0] atScrollPosition:UITableViewScrollPositionTop animated:NO];
     ......

  }

现在它显示最后一页上确切的剩余单元格!我不再需要设置contentSize了。