Используйте ячейку tableView willDisplay forRowAt indexPath для пользовательских ячеек (с пользовательской высотой) - PullRequest
0 голосов
/ 05 апреля 2020

В моем проекте есть UITableView, отображающий пользовательские ячейки фиксированной высоты.

Когда я перехожу к ViewController, я хочу запустить анимацию в tableViewCells. когда я прокручиваю вниз, а затем возвращаюсь к первой ячейке, я не хочу снова запускать анимацию. Для этого я использую tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath). Затем я использую массив, чтобы запомнить, какие ячейки уже были на экране.

Моя функция выглядит следующим образом:

func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {

      let myCell = cell as! myTableViewCell
        if !alreadyShown.contains(indexPath) {
            alreadyShown.append(indexPath)
            myCell.animate()
        } else {
            myCell.dontAnimate()
        }
}

Однако, похоже, это игнорирует высоту моей ячейки. Поэтому он работает для каждого indexPath, который был бы отображен для стандартных ячеек (например, 17 раз на iPhone X), ​​даже если 14 из этих 17 ячеек не видны. Когда я прокручиваю позже, анимация уже завершена для этих 14 следующих ячеек.

Есть ли способ сообщить функции ячейки willDisplay высоту ячейки, чтобы она знала, какие ячейки действительно будут отображаться? Или есть какой-то другой способ сохранить счет, какие ячейки уже были отображены?

1 Ответ

0 голосов
/ 06 апреля 2020

Решением было установить estimatedRowHeight для tableView на число, равное или большее, чем фактическая высота ячеек в viewDidLoad. Это обеспечило вызов tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) только для реально видимых ячеек.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...