Сохранение позиции прокрутки в UITableView
У меня есть небольшая проблема с моим приложением iOS в xcode. У меня есть UITableView, который загружает несколько сотен ячеек. Когда я прокручиваю вниз до определенной ячейки и перебираюсь к подробным контроллерам и снова возвращаюсь, таблица основных представлений вернулась полностью. Я рассмотрел следующие два вопроса, которые похожи.
Как я могу получить позицию прокрутки UITableView, чтобы сохранить ее?
Установка позиции прокрутки в UITableView
Я все еще не могу заставить их работать. Я не самый опытный кодер, поэтому я действительно борюсь с этим.
Я знаю такие вещи, как viewWillDisappear и viewDidAppear, которые нужно изменить, но я просто не могу получить гораздо больше.
В этой таблице у меня есть функция reloadData, поэтому можно удалить последние данные с сервера, а также рабочую панель поиска.
Во всяком случае, рука для помощи была бы замечательной. Спасибо,
Лука
Ответы
Ответ 1
Сортировано!
С немного вдохновения от Десденова, пока на работе я хорошо подумал об этом и понял, что это может быть. Помня, что у меня была панель поиска, несколько месяцев назад я реализовал следующий код, чтобы скрыть его:
[self.tableView setContentOffset:CGPointMake(0,-20) animated:NO];
В наивности я положил это в viewDidAppear
, а не viewDidLoad
. Очевидно, что это скрывало панель поиска, но при этом она была в неправильной команде void, она делала это каждый раз, когда masterDetailView возвращался в начало стека. Итак, после перемещения вышеуказанного кода в viewDidLoad он теперь все еще скрывает его, но только один раз.
Я просто излагаю это как для других начинающих, таких как я, которые могут столкнуться с одной и той же проблемой и могут просто сохранить их разумность!
Спасибо всем вам за ваши идеи, которые помогли мне.
+1 всем вам!
Ответ 2
Здесь вы должны сначала сохранить прокрученную позицию tableView
i.e. contentOffset
of tableView
, а затем повторно использовать ее, когда вернетесь к tableView
.
1) Когда и где вы его сохраните:
Когда: в точке, когда вы сверляете до detailViewController
, сохраните contentOffset
в tableView
Как: float verticalContentOffset = tableView.contentOffset.y;
2) Как вы вернете tableView обратно в ту же прокрученную позицию:
[tableView setContentOffset:CGPointMake(0, verticalContentOffset)];
Надеюсь, это поможет вам.
Ответ 3
Если кто-то задается вопросом, я попробовал решение от Prashant N, и это сработало. Однако reloadData
на самом деле reset положение прокрутки больше нет, поэтому мне не нужно было ничего, кроме reloadData
.
Ответ 4
Мое решение этой проблемы состояло в прокрутке таблицы к индексу последнего элемента.
private func scrollToItem(item:Int, section:Int bottom:Bool = true, animated:Bool = false) {
let indexPath = NSIndexPath(forRow: item:Int-1, inSection: section)
var position = UITableViewScrollPosition.Bottom
if (!bottom) { position = UITableViewScrollPosition.Top }
self.tableView.scrollToRowAtIndexPath(indexPath, atScrollPosition: position, animated: animated)
}
Ответ 5
По какой-то причине это было на полпути для меня (иногда позиция была бы приблизительной). Я, наконец, использовал следующее априори менее чистое решение
NSIndexPath *firstVisibleIndexPath = [[self.tableView indexPathsForVisibleRows] objectAtIndex:0];
[self.tableView scrollToRowAtIndexPath:self.firstVisibleIndexPath atScrollPosition:UITableViewScrollPositionTop animated:NO];
self.firstVisibleIndexPath = firstVisibleIndexPath;
который работал лучше.
Ответ 6
Мое решение для коллекции:
CGFloat oldCollectionViewHeight = self.messageCollectionView.contentSize.height;
[self.messageCollectionView reloadData];
[self.messageCollectionView layoutIfNeeded];
CGFloat newCollectionViewHeight = self.messageCollectionView.contentSize.height;
if (oldCollectionViewHeight) {
self.messageCollectionView.contentOffset = CGPointMake(0, newCollectionViewHeight - oldCollectionViewHeight);
}
Для таблицы принцип тот же.
Ответ 7
Как упоминалось в других комментариях, прокрутка вверху на Назад навигации в UINavigationController не является поведением по умолчанию.
Другая причина может заключаться в том, что вы устанавливаете ячейку в верхней части таблицы в качестве первого ответчика в viewWillAppear, например. поле поиска или поле редактирования в верхней части таблицы. UITableViewController будет автоматически прокручивать первый ответчик в представлении, что приятно. Пока это то, что вы пытаетесь сделать.:) Позаботьтесь, чтобы не установить первого ответчика в viewWillAppear, если это не то, что вы хотите. Cheers, AZ
Ответ 8
Вам не нужно ничего делать, пока вы находитесь в одном контроллере вида, ваше положение будет таким же. Я боюсь, что где-то в вашем представлении контроллер называется reloadData. Найдите какой-нибудь метод, вызывающий scrollToRowAtIndexPath.
Ответ 9
В моем случае эти 3 строки помогли. Вам нужно указать высоту строки и добавить пустое пространство внизу.
tableView.rowHeight = UITableView.automaticDimension
tableView.estimatedRowHeight = 600
tableView.contentInset.bottom = 40