UITableView не показывает удаленное изображение до прокрутки или перезагрузки tableviewcell - PullRequest
0 голосов
/ 18 января 2019

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

Я хотел бы отобразить эти изображения в UITableViewCell

В настоящее время изображения не отображаютсяпока я не прокручиваю.

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

Чтобы устранить эту проблему, я назвал tableView.reloadRows(at: [indexPath], with: .none) в обработчике завершения Kingfisher

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

    let cell = tableView.dequeueReusableCell(withIdentifier: "FeedTableViewCellId", for: indexPath) as! FeedGifCell

    let url = URL(string: items[indexPath.item])!
    let imageView = ImageResource(downloadURL: url, cacheKey: "\(url)-imageview")
    let placeHolderImage = UIImage.from(hex: "ffffff").resize(width: 1, height: 190)
    cell.gifImage.kf.setImage(with: imageView, placeholder: placeHolderImage) { _ in
        tableView.reloadRows(at: [indexPath], with: .none)
    }

    return cell
}

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

Я не уверенэто лучший подход, мне не нравится звонить tableView.reloadRows(at: [indexPath], with: .none) это немного ..... хакерски.

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

Можно ли вообще запретить видимую ячейку, пока изображение не будет применено?

1 Ответ

0 голосов
/ 18 января 2019

Нет! Вам не нужно каким-либо образом перезагружать tableView после завершения загрузки изображения в определенной ячейке. Кроме этого, вы все делаете правильно. Я тоже использую Kingfisher.

Но в будущем вы могли бы просто создать функцию в своем классе ячеек, скажем setupCell(_ imageURL: URL?). В любом случае, в вашем методе cellForRow просто сделайте это так:

cell.gifImage.kf.setImage(with: imageView, placeholder: placeHolderImage, completionHandler: nil)

Теперь, если изображение не загружено или у вас нет строки URL-адреса изображения для объекта URL, вы можете перехватить его в блоке ошибок Kingfisher, тогда вам нужно будет передать свой error image (a UIImage) Объект вашего imageView, чтобы не было дублированного изображения.

Например, в функции setupCell() моей клетки есть следующее:

    if let url = vendor.image?.URLEscaped {
        let resource = ImageResource(downloadURL: url, cacheKey: url.absoluteString)
        self.imageView_Vendor.kf.setImage(with: resource, options: [.transition(.fade(0.2)), .cacheOriginalImage])
        return
    }

    self.imageView_Vendor.image = nil

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

EDIT:

Для обработки высоты изображения это может помочь: https://stackoverflow.com/a/52787062/3231194

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