Метка CollectionView AutoResize не работает

У меня есть вертикальное представление коллекции с меткой, и в моем потоке я использую UICollectionViewFlowLayoutAutomaticSize изменить размер ячейки, но это дает мне ошибку, когда я даю очень длинную строку для метки, номер строки в label установить на 0

ошибка

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

Экземпляр UICollectionViewFlowLayout - это UICollectionViewFlowLayout, и он присоединен к UICollectionView; кадр = (0 88; 375 690); clipsToBounds = YES; авторазмер = RM+BM; gestRecognizers = NSArray layer = CALayer; contentOffset: {0, 0}; contentSize: {375, 2}; AdjustContentInset: {0, 0, 0, 0}> макет представления коллекции: UICollectionViewFlowLayout

Создайте символическую точку останова в UICollectionViewFlowLayoutBreakForInvalidSizes, чтобы перехватить это в отладчике.

Поведение UICollectionViewFlowLayout не определено, потому что ширина элемента должна быть меньше ширины UICollectionView минус значения вставки раздела слева и справа, минус вставки содержимого слева и справа

Ограничения

введите описание изображения здесь

Код

let array = ["Hello", Array(repeating: "Hello", count: 100).joined(), "blah"]
// on viewDidLoad method
 if let flowLayout = collectionView.collectionViewLayout as? UICollectionViewFlowLayout {
        flowLayout.estimatedItemSize = CGSize(width: 1, height: 1)
        flowLayout.itemSize = UICollectionViewFlowLayoutAutomaticSize
    }

1 ответ

Решение

Проблема в том, что по какой-то причине UICollectionViewFlowLayout не устанавливает максимальную ширину ячейки, и, поскольку у вас установлены ограничения, как и у вас, происходит следующее: width ячейки или нескольких ячеек больше, чем ширина collectionView,

Вот как это исправить, добавить width ограничение вашего ярлыка внутри вашего UICollectionViewCell подкласс и установить его не equal но less than equal,

Добавить ограничение

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

Выход

Затем в CollectionViewDataSourcecellForItemAtIndexPath Вы можете установить постоянную ширину меньше CollectionView Ширина минус заполнение вы добавили (в моем случае метка имеет отступы 20 + 20 для левой и правой).

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "reuse", for: indexPath) as! CollectionViewCell

    cell.widthConstraint.constant = collectionView.bounds.size.width - 40
    //line above sets maximum width of label to be maximum the width of the collection view
    cell.label.text = array[indexPath.item]
    return cell
}

Результатом является представление коллекции, как показано ниже:

Другие вопросы по тегам