Для динамического определения размера ячеек, основанного на длине вашего контента, вам в основном нужно сделать несколько приближений.Так вот мое решение.Для правильных расчетов требуется пара проб и ошибок.Пожалуйста, потерпите меня сейчас!
override func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
if let user = datasource?.item(indexPath) as? User {
let approximateWidthBioTextView = view.frame.width - 10 - 60 - 10
let size = CGSize(width: approximateWidthBioTextView, height: 1000)
let attributes = [NSAttributedString.Key.font: UIFont.systemFont(ofSize: 15)]
let estimatedFrame = NSString(string: user.bio).boundingRect(with: size, options: .usesLineFragmentOrigin, attributes: attributes, context: nil)
return CGSize(width: view.frame.width, height: estimatedFrame.height + 73)
}
return CGSize(width: view.frame.width, height: 200)
}
По сути, вам нужно изменить функцию sizeForItem и сделать некоторые приближения.Мое содержание определяется экземплярами User Class
.Поэтому убедитесь, что перед тем, как вы начнете получать ссылки на контент, который у вас есть в вашей камереВ моем случае это пользователи, которые должны отображаться.В нескольких словах мои решения получают высоту ячейки на основе user.bioText.Потому что это единственный элемент, который меняет размер в моей ячейке.Так что имейте это в виду.
Сначала вы должны вычислить collectionView с помощью.В моем случае это ширина кадра минус поля (10, 60 и 10).Помните, важно сделать это правильно.
Во-вторых, чтобы оценить высоту ячейки, нам нужно обернуть ее в прямоугольник, который имеет некоторые атрибуты, которые необходимо заполнить.В константе size
мы сознательно даем высокое значение, чтобы система брала то, что ей действительно нужно.Теперь для атрибутов, если ваш контент является строкой, как в моем случае, убедитесь, что у вас тот же размер шрифта.
Наконец, в разделе возврата return CGSize(width: view.frame.width, height: estimatedFrame.height + 73)
нам все еще нужно внести некоторые исправления, потому что текст имеет некоторые внутренние отступы, если я могу так сказать, и если вы не исправите это, высота вашей ячейки не будет отображаться правильно,Убедитесь, что вы играете с последним значением estimatedFrame.height + 73
, в моем случае 73, пока не дойдете до точки, где ваши клетки высотой динамически распределяются идеально.Это единственный способ.Это точно работает для меня.
Кстати, не беспокойтесь, если ваш код выглядит немного по-другому (хотя и не слишком).Я использую рамки, но принципы расчета те же.Если вы спрашиваете себя, откуда берется значение 73, то это потому, что в верхней части текста биографии, который мне нужно отобразить в каждой ячейке, у меня есть метки имени пользователя и имени пользователя, которые имеют восемь из 20, что составляет 40в общей сложности 33 - это разрыв или поля между ними.Пока вы даете ему минимальное значение, оно должно работать.Это на самом деле не влияет на результат, если вы даете ему слишком высокое значение.Так что экспериментируйте!