Как отметили @rmaddy и @Prashant,
Вы не должны использовать cellForItemAt
в sizeForItemAT
, потому что sizeForItemAt
называется ДО инициализации ячейки в cellForItemAt
И, скорее всего, это причина вашего крушения.На пути к решению.
Я столкнулся с аналогичной проблемой (пришлось динамически управлять высотой), и я сделал что-то вроде
Рассчитать примерную ширину вашей метки на основе текста.используйте следующее расширение строки
//calculates the required width of label based on text. needs height and font of label
extension String {
func width(withConstrainedHeight height: CGFloat, font: UIFont) -> CGFloat {
let constraintRect = CGSize(width: .greatestFiniteMagnitude, height: height)
let boundingBox = self.boundingRect(with: constraintRect, options: .usesLineFragmentOrigin, attributes: [.font: font], context: nil)
return ceil(boundingBox.width)
}
}
Теперь внутри sizeForItemAt
//put actual lblHeight here
let lblHeight = Put_actual_label_height_here // e.g 30
//put actual label font here
let lblFont = Put_actual_label_font_here //e.g UIFont.boldSystemFont(ofSize: 20)
//calculate required label width
let lblRequiredWidth = yourLabel's_Text_String.width(withConstrainedHeight: lblHeight, font: lblFont)
//you may want to return size now
let height = yourItemsHeight
return CGSize(width: lblRequiredWidth, height: height)
Теперь, когда вы получили требуемую ширину вашей метки, вы можете настроить размерэлемент, основанный на ширине этикетки.
Надеюсь, это поможет.Дайте мне знать, если вам нужна помощь.Спасибо