Можно ли изменить размер ячейки до того как изображение загрузится?


#1

Доброго времени суток
Я использую библиотеку Kingfisher и мне необходимо вывести изображения в ‘tableView’
Мое API не возвращает мне высоту и ширину изображения, возвращается только url изображения
Так вот я нашел способ расчитывать новую высоту ячейки исходя из данных которые мне возвращает библиотека Kingfisher. То есть вот так:
cell.image_of_new.kf.setImage(
with: url,
placeholder: UIImage(named: “placeholderImage”),
options: [
.scaleFactor(UIScreen.main.scale),
.transition(.fade(1)),
.cacheOriginalImage,
])
{
result in
DispatchQueue.main.async {

            let ratio = Float(result.value?.image.size.width ?? 50) / Float(result.value?.image.size.height ?? 50)
            let newHeight = Float(cell.frame.width) / ratio
            cell.image_height.constant = CGFloat(newHeight)
            self.view.layoutIfNeeded()

            }
            
        }

Суть в том что ячейка изначально вывела всю информацию, а потом считает размер и выводит изображение
Из за этого ячейка скачет от перезагрузки
Можно ли сначала посчитать размер ячейки и потом заполнять ее
Если да то как это сделать?


#2

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


#3

Я понимаю что это не правильно
Но дело в том что я не нашел способ сначала получать изображение, делать расчеты, а потом их отображать
Не могли бы вы мне помочь решить эту проблему?


#4

Можно попробовать сделать через github (AsyncDisplayKit)
Вот их сайт


#5

Вы же написали что у вас размеры изображения возвращаются через API. Не вижу никакой проблемы делать расчеты после получения всех данных.


#6

Прошу прощения, отредактировал
Я не получаю высоту и ширину по API
Поэтому прошу помощи


#7

Если есть возможность получать размер по API, это 100% рабочий способ.
В остальных случаях всегда будет немного прыгать.
Была давно похожая тема. Там то ли я, то ли кто-то другой, предлогали вариант заранее загрузить все картинки и сохранить их размеры в массив, который далее будет использоваться в расчетах высоты ячейки.
У вас в любом случае при первой загрузке изображения, высота ячейки будет иметь дефолтный размер. Только после этого, кога изображение будет в кеше, тогда ваша ячейка отработает быстро и вы не заметите изменение ее высоты.
Так что тут остается только обходными путями изворачиваться.


#8

Вариант заранее определить высоту ячейки и вписывать туда полученные изображения чем плох? До загрузки закрыть места картинок заглушкой (пример - любое банковское приложение).


#9

Можете привести пример?

Вариант заранее определить высоту ячейки

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


#10

Он имеет в виду все ячейки под один размер, а картинку вписывать через aspectFill, сколько влезет.


#11

именно так :slight_smile:


#12

Всем спасибо за ответы