IOS 8 UITableView самонастраивающиеся ячейки прыгают/сдвигаются визуально при нажатии на новый контроллер просмотра

Вот как я устанавливаю свою таблицу:

self.tableView = [[UITableView alloc] initWithFrame:self.view.bounds];
self.tableView.delegate = self;
self.tableView.dataSource = self;
self.tableView.estimatedRowHeight = 150;
[self.view addSubview:self.tableView];

В моих ячейках я вызываю - (CGSize)sizeThatFits:(CGSize)size, чтобы программно вернуть высоту (которая установлена ​​в - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath. Я не использую ограничения или автозапуск.

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

Однако проблема заключается в том, что я нажимаю новый контроллер представлений, ячейки меняются/меняются визуально (вверх или вниз). Кажется, что это прыжок, основанный на вычислении оцененных значений высоты строки, но размерThatFits также вызывается для каждой видимой ячейки перед переключением, поэтому я действительно запутался (не уверен, почему либо нужно вообще называть, так как я покидаю Посмотреть). Я проверил contentOffset для tableView - он не изменился, поэтому это не проблема.

Ответ 1

Хорошо, я решил это, кэшируя высоты ячеек в sizeThatFits и возвращая это значение для оцениваемых высот ячеек в пределах делегата. Прекрасно работает.

Ответ 2

Быстрое исправление:

override func viewWillDisappear(animated: Bool) {
    super.viewWillDisappear(animated)
    self.tableView.reloadData()
}

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

Я кэшировал высоты в таблицеView (_: willDisplayCell: forRowAtIndexPath:) в словарь с уникальным идентификатором для данных в виде ключей таким образом, когда данные добавляются или обновляются. Я могу просто удалить эту высоту из кеша и использовать более оцененные высоты, так что только эта ячейка использует ориентировочную высоту. Пока это решает все мои проблемы с прыжками и прокруткой.