iPhone UITableView Добавить контент в верхней части без прокрутки - PullRequest
10 голосов
/ 29 октября 2011

У меня потенциально очень длинный журнал прокрутки сообщений в UITableView. Пользователь сможет перемещаться по таблице с помощью прокрутки.

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

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

Один из способов, которыми я могу попытаться реализовать это, - вставка данных в NSMutableArray с индексом 0. Будет ли это работать? Дополнительный вопрос: насколько дорого стоит вставка данных в начале NSMutableArray. Я ожидаю, что такая операция оптимизирована, но хотел бы убедиться. Чего мне не хватает в этой реализации?

Спасибо!

Ответы [ 3 ]

13 голосов
/ 29 октября 2011

Как вставить без изменения вида:

  • Используйте значения tableView (UIScrollView) contentOffset, чтобы найти, где пользователь прокручивается в данный момент.
  • Добавьте новую строку вверху с помощью animated:NO
  • Обновите tableView contentOffset, чтобы она была там, где был пользователь, плюс независимо от высоты вашего ряда.

Как избежать проблем, возникающих при перетаскивании пользователя:

  • Отслеживайте, когда пользователь перетаскивает, и, если вы хотите вставить строки во время перетаскивания / перемещения, добавьтеих в очередь, которая выполняется после освобождения пользователя.
6 голосов
/ 06 апреля 2015
CGSize beforeContentSize = self.tableView.contentSize;
            [self.tableView reloadData];
            CGSize afterContentSize = self.tableView.contentSize;

            CGPoint afterContentOffset = self.tableView.contentOffset;
            CGPoint newContentOffset = CGPointMake(afterContentOffset.x, afterContentOffset.y + afterContentSize.height - beforeContentSize.height);
            self.tableView.contentOffset = newContentOffset;
2 голосов
/ 03 февраля 2012

Только что опубликовал ответ с фрагментами кода здесь

Сохраняйте uitableview статичным при вставке строк сверху

В основном:

  • Сохраните смещение прокрутки там, где вы бы вызвали beginUpdate:.
  • Вместо вызовов к InsertCell вы добавляете высоту ячейки к сохраненному смещению.
  • Где бы вы вызвали endUpdate :, вызовите reloadData, а затем прокрутите сохраненное смещение без анимации.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...