Ячейки iOS UITableViewController, выпрыгивающие из места после изменения высоты ячеек при первом изменении
Обновление: похоже на tableView.estimatedRowHeight
настройка как-то связана с проблемой, так как дисперсия проблемы меняется с изменением числа, а установка его на 9999 делает его "уходящим", но это кажется супер хакерским. 9999 также ломает анимацию, которую я намеревался сделать на шоу / скрыть. 9999 также нарушает функциональность полос прокрутки. Смотрите ветку обсуждения ниже для получения дополнительной информации и полного контекста.
У меня есть контроллер вида, который содержит два Container Views
, Каждый контейнерный вид содержит UITableView
контроллер. Они ориентированы вертикально, каждый занимает всю высоту.
Контейнер с правой стороны имеет ширину 100 и начинается за пределами экрана с заданным ограничением -100, что позволяет другому контейнеру изначально заполнить весь экран.
Таблица слева имеет автоматическую настройку высоты ячеек с помощью UITableViewAutomaticDimension
поскольку при отображении скрытого представления некоторый текст в две строки может потребоваться перенести на следующую строку.
Когда я изменяю ограничение на 0 и показываю представление, если я не наверху списка, вместо того, чтобы расширять то, что видно на экране, оно, кажется, расширяет все, таким образом выталкивая то, что было на экране вниз, дальше, чем должно быть.
Что странно, так это последующее расширение / свертывание работы, как и ожидалось, только корректировка того, что видно.
Я приложил видео и видео, показывающее проблему, я просто пытаюсь соединить вещи и заставить работать размер сейчас, содержание в правильном представлении будет отличаться в конечном счете.
Вот что происходит в видео
- Я раскрываюсь / сворачиваюсь из верхней части списка, и все работает как положено
- Я прокручиваю до середины списка и расширяюсь, и мой контент перемещается дальше, чем должно быть.
- Затем я снова сворачиваю и расширяю его, и на этот раз он остается на месте, поскольку на видимом экране не изменились размеры.
Неважно, насколько далеко я иду по списку, происходит то же самое поведение, которое ухудшается, когда я иду дальше вниз.
Сейчас я настраиваю ограничения, как это, при нажатии кнопки.
if self.timeContainerConstraint.constant == 0 {
self.timeContainerConstraint.constant = -90.0
} else {
self.timeContainerConstraint.constant = 0.0
}
Кто-нибудь знает, почему контент прыгает, когда я прокручиваю список вниз и расширяюсь в первый раз, но не прыгаю при последующих попытках?
1 ответ
Поскольку у вас есть переменная высота ячеек, табличное представление не может правильно рассчитать смещение прокрутки при изменении его кадра. Он должен полагаться на предполагаемую высоту строки, но поскольку у вас есть фиксированное значение для этого, чем больше ячеек "выше" текущей позиции прокрутки, тем больше погрешность между оценочным и фактическим значением.
Я смог решить эту проблему путем кэширования высоты ячеек, чтобы получить более точную расчетную высоту, используя estimatedHeightForRowAt:
var cellHeights = [IndexPath:CGFloat]()
func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
let frame = tableView.rectForRow(at: indexPath)
self.cellHeights[indexPath] = frame.size.height
}
func tableView(_ tableView: UITableView, estimatedHeightForRowAt indexPath: IndexPath) -> CGFloat {
return self.cellHeights[indexPath] ?? 140.0
}
При таком подходе расширение и сжатие боковой панели не влияло на положение стола. Я смог анимировать изменение ограничения для хорошего плавного раскрытия, и таблица не "прыгала", даже если таблица прокручивалась, пока открывалась боковая панель.
Мой пример проекта здесь