IOS: scrollToRowAtIndexPath не отображает правильный верхний индексный путь для последней страницы

Я пытаюсь прокрутить табличный вид программно, как показано ниже. Обратите внимание, что я увеличил размер содержимого, чтобы увидеть несколько оставшихся строк. Я могу прокручивать вручную правильно, чтобы получить требуемый индексный путь вверху, но программно это не происходит.

[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 для последней страницы!

Может кто-то, пожалуйста, помогите мне разобраться. Благодарю.

Это ручное прокрутка изображения:

Это делается программно:

2 ответа

Кажется, я не собираюсь это делать. Мне нужны ячейки последней страницы только на долю времени, а затем я возвращаюсь обратно к исходному кадру.

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

for (int i = 0; i < ceil((float)rows/numberofRowsInView); i++) {
 ********** 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.


Если на экране появится 17 строк, вы не сможете прокручивать так, чтобы отображалось менее 17 предметов. Таким образом, представление таблицы приведет к тому, что строка, которую вы запросили, находится наверху, и прокрутите ее до ближайшего, что означает, что представление "полно" строк. В основном это потому, что 60 не (точно) делится на 17, поэтому представление таблицы не позволит вам показывать только половину страницы.

Кроме того, вы можете попробовать использовать метод просмотра прокрутки setContentOffset:animated: на основе фрейма ячейки, которую вы хотите в верхней части (rectForRowAtIndexPath:.

licensed under cc by-sa 3.0 with attribution.