Как обновить высоту ячейки таблицы после загрузки изображения и быстрого изменения ограничения высоты? - PullRequest
0 голосов
/ 13 сентября 2018

Как обновить высоту ячейки табличного представления после обновления ограничения высоты изображения для загруженного асинхронного изображения?

Как запустить ретрансляцию ячеек tableView после загрузки изображения и изменения ограничений?

Какой лучший способ сделать это?

Уже пытался поместить код в основную очередь Dispatch, но результаты те же. Я делаю это в методе cellForRow, а также перенес его в willDisplayCell. Снова и снова эта проблема ...

Пример кода с использованием библиотеки Kingfisher для кэширования изображений:

    if let imgLink = post.imageLink {
                if let url = URL(string: imgLink) {

                    cell.postImage.kf.setImage(with: url, placeholder: UIImage(), options: nil, progressBlock: nil) { (image, error, cacheType, imageURL) in

                        if let image = image, cell.tag == indexPath.row {
                            cell.heightConstraint.constant = image.size.height * cell.frame.size.width / image.size.width   
                        }
                    }
                }
    }

Ответы [ 2 ]

0 голосов
/ 13 сентября 2018

Что я на самом деле делал и как-то работал, так это:

if (self.firstLoaded[indexPath.row] == false) {
                            self.firstLoaded[indexPath.row] = true
                            DispatchQueue.main.async {
                                self.tableViewController.tableView.reloadData()
                            }
}

firstLoaded просто сообщает таблице, что эта строка уже получила изображение с URL и вычислила / сохранила правильную высоту.

Также я использовал это:

override func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
        cellHeights[indexPath] = cell.frame.size.height
}

override func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
        return UITableViewAutomaticDimension
}

override func tableView(_ tableView: UITableView, estimatedHeightForRowAt indexPath: IndexPath) -> CGFloat {
        if let height = cellHeights[indexPath] {
            return height
        }
        return 1500
}

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

Спасибо!

0 голосов
/ 13 сентября 2018

У меня была такая же проблема. Вам нужно помнить, что Tableview повторно использует ячейку, и вы загружаете изображение асинхронно.

Рекомендовано : Вы можете попросить команду бэкхенда предоставить вам высоту и ширину изображения, чтобы вы могли рассчитать высоту ячейки и вернуться как можно скорее.

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

Другое дело, что вы должны делать это как в ячейке cellForRow, так и в ячейке willDisplay (я знаю, что это не очень хорошая практика, но для удовлетворения автоматического измерения в табличном представлении)

после обновления постоянной высоты вы должны использовать эту пару кода для перезагрузки вашей ячейки.

    cell.setNeedsLayout()
    cell.layoutIfNeeded()

Как я это сделал

 if let imagesize = post.imageSize { 
      cell.updateHeightPerRatio(with: imagesize)

 } else {
      // Here load size from URL  and update your datasource 

  } 
  // Load image from URL with any SDWebimage or any other library you used
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...