Как динамически изменять размер CollectionViewCell согласно UILabel - PullRequest
0 голосов
/ 09 января 2020

Я создаю предложение / теги просмотра. Который в основном горизонтальный uicollectionview. У меня есть пользовательская ячейка, в которой у меня есть только одна метка без автоматического изменения размера или автоматического ограничения. И у меня есть массив var tagsArray = ["Label", "A Long Label", "A very long label"], который я использую в методах делегата collectionView:

func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
    return tagsArray.count
}

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
    let size = (tagsArray[indexPath.row] as NSString).size(withAttributes: nil)
    return size
}

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {

    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "TagCell", for: indexPath) as! TagCollectionViewCell
    cell.tagLabel.text = tagsArray[indexPath.row]
    return cell

}

Вторая функция collectionViewLayout - это то, что я выбрано переполнение стека формы, но когда я его запускаю, это не влияет на UILabel.

Вот вывод: enter image description here

1 Ответ

2 голосов
/ 09 января 2020

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

  1. Установите collectionView высоту, равную ожидаемой высоте тегов.
  2. Установите tagLabel leading, trailing, top и bottom ограничения, равные ограничениям contentView соответствующей ячейки.
  3. Удалите реализацию func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize. Размер ячейки будет рассчитан автоматически, если вы не используете пользовательское значение для estimatedItemSize. Если вы хотите быть уверены, добавьте (collectionView.collectionViewLayout as? UICollectionViewFlowLayout)?.estimatedItemSize = UICollectionViewFlowLayout.automaticSize к функции, в которой вы настраиваете все виды.

Вы увидите следующий результат:

Running on iPhone 11 Pro Max simulator

...