Асинхронное изображение установлено в ячейку с ошибкой динамической высоты - PullRequest
0 голосов
/ 13 октября 2018

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

Видео об ошибке: https://youtu.be/nyfjCmc0_Yk


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


func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {



            var post : Post
            var cell : PostCell
            post = Posts.shared.post(indexPath: indexPath)

            // I REMOVED SOME NOT IMPORTANT PARTS OF THE CODE 
            // (like setting the text, etc)

            if post.images.count > 0 {
                // Images is attached to the post

                cell.postImageView.sd_setImage(with: URL(string: appSettings.url + "/resources/img/posts/" + post.images[0]), placeholderImage: nil, options: [.avoidAutoSetImage]) { (image, error, type, url) in
                    if let error = error {
                        // placeholder
                        return
                    }

                    DispatchQueue.main.async {
                        let cgRect = image!.contentClippingRect(maxWidth: 300, maxHeight: 400)
                        cell.postImageView.isHidden = false

                        cell.postImageWidthConstraint.constant = cgRect.width
                        cell.postImageViewHeightConstraint.constant = cgRect.height

                        cell.postImageView.image = image

                        cell.layoutIfNeeded()
                        self.cellHeights[indexPath] = cell.frame.size.height

                    }
                }


            } else {
                // No image is attached to the post
                cell.postImageViewHeightConstraint.constant = 0
                cell.postImageWidthConstraint.constant = 0
                cell.postImageView.isHidden = true
            }
            return cell


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

        cell.layoutIfNeeded()

    }
    func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
        return UITableViewAutomaticDimension
    }
    func tableView(_ tableView: UITableView, estimatedHeightForRowAt indexPath: IndexPath) -> CGFloat {
        if cellHeights[indexPath] != nil {
            return CGFloat(Float(cellHeights[indexPath] ?? 0.0))
        }
        else {
            return UITableViewAutomaticDimension
        }
    }

Я пытался позвонить tableView.beginUpdates() tableView.endUpdates(), это решает проблему в начале, но при прокрутке создает странную ошибку:

https://youtu.be/932Kp0p0gfs

(случайное появление небольшой части изображения в виде таблицы)

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

Что я делаю не так?

1 Ответ

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

Вы наверняка получите такую ​​ошибку, если будете рассчитывать высоту и ширину данных UIImage и назначать эти значения в качестве констант ограничения UIImageView, особенно в ячейке.

Решение для этого?Сделайте так, чтобы ваш источник / сервер данных имел вычисленную ширину и высоту и избегал их вычисления самостоятельно.То есть в каждом вашем Post объекте должны быть готовые значения ширины и высоты.Это быстрее, и это решило мою проблему так же, как и вашу (см. Мой милый личный быстрый проект: https://itunes.apple.com/us/app/catlitter-daily-dose-of-cats/id1366205944?ls=1&mt=8)

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

Надеюсь, это поможет.

...