Динамическое изменение размера ячейки представления коллекции - PullRequest
0 голосов
/ 01 мая 2020

У меня есть этот старый пример кода, который я обновил, но я все еще новичок ie и не могу понять, как исправить эту ошибку:

В классе, который содержит коллекцию представление:

var array = ["Just testing this out"]

Теперь в расширении UICollectionViewDelegateFlowLayout:

private func estimateFrameForText(text: String) -> CGRect {
    //we make the height arbitrarily large so we don't undershoot height in calculation
    let height: CGFloat = 1000

    let size = CGSize(width: 398, height: height)
    let options = NSStringDrawingOptions.usesFontLeading.union(.usesLineFragmentOrigin)
    let attributes = [NSAttributedString.Key.font: UIFont.systemFont(ofSize: 17, weight: UIFont.Weight.light)]

    return NSString(string: text).boundingRect(with: size, options: options, attributes: attributes, context: nil)
}

Также:

private func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAtIndexPath indexPath: NSIndexPath) -> CGSize {
    var height: CGFloat = 295
    //we are just measuring height so we add a padding constant to give the label some room to breathe!
     var padding: CGFloat = 14
    //estimate each cell's height
    if let text = array[indexPath.item].text {
          height = estimateFrameForText(text).height + padding
     }
     return CGSize(width: 398, height: height)    }

Здесь я получаю сообщение об ошибке:

if let text = array[indexPath.item].text

А вот UILabel из класса ячеек представления коллекции, я понятия не имею, где реализовать:

@IBOutlet weak var TextPosted: UILabel!

1 Ответ

0 голосов
/ 01 мая 2020

Ваш тестовый массив нуждается в некоторой настройке. Попробуйте объявить его необязательным (поскольку он, вероятно, будет с фактическими данными, загруженными откуда-то).

var array: [String]? = ["Just testing this out", "Another test"]

Тогда это:

override func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
    return array?.count ?? 0
}

Затем обновите оператор if let в вашем collecitonView Функция sizeForItemAtIndexPath:

if let text = array?[indexPath.item]{
}

В примечании к статье я написал расширение с открытым исходным кодом для измерения размера строки для таких вещей за несколько дней до go.

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

...