IPhone UITableView Добавить контент сверху без прокрутки

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

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

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

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

Спасибо!

Ответ 1

Как вставить без наложения вида:

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

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

  • Следите за тем, когда пользователь перетаскивает, и если вы хотите вставлять строки во время перетаскивания/движения, добавьте их в очередь, которая выполняется после того, как пользователь выпустит.

Ответ 2

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;

Ответ 3

Просто отправил ответ с фрагментами кода здесь

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

В принципе:

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