Метка 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
,
Затем создайте выход для этого ограничения, чтобы его можно было установить позже.
Затем в CollectionViewDataSource
cellForItemAtIndexPath
Вы можете установить постоянную ширину меньше 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
}
Результатом является представление коллекции, как показано ниже: