我有一个 UICollectionView,充当标签列表。
它采用水平构图布局。
我的问题是,如果我的标签比集合的宽度长,它会崩溃并出现以下错误:
错误:使用指定的间距和大小的无效组合创建 NSCollectionLayoutItem。该组甚至无法容纳单个项目。
我理解这个错误,这是有道理的。但是如何强制 UILabel(UICollectionViewCell 的唯一组件)断线?
我已将 numberOfLines 设置为 0。ViewCell 是从带有自动布局的 xib 加载的,这是非常基本的(UILabel 坚持超级视图)。
最后,组合代码如下:
let layoutSize = NSCollectionLayoutSize(widthDimension: .estimated(50), heightDimension: .estimated(20))
let item = NSCollectionLayoutItem(layoutSize: layoutSize)
let group = .horizontal(layoutSize: .init(widthDimension: .fractionalWidth(1), heightDimension: layoutSize.heightDimension), subitems: [item])
group.interItemSpacing = .fixed(10)
let section = NSCollectionLayoutSection(group: group)
section.contentInsets = .init(top: 4, leading: 16, bottom: 4, trailing: 16)
let layout = UICollectionViewCompositionalLayout(section: section)
let collectionView = UICollectionView(frame: .zero, collectionViewLayout: layout)
我不明白是什么阻止了 UILabel 分成多行?
查看您的
collectionView
设置。
我认为下面是问题所在
let layoutSize = NSCollectionLayoutSize(widthDimension: .estimated(50), heightDimension: .estimated(20))
estimated
的意思是:Dimension is estimated with a point value. Actual size will be determined when the content is rendered.
因此,每当您的文本过长时,其宽度超过屏幕大小都会导致错误。
为了换行,集合视图单元格需要知道它的宽度(这不能灵活)。有两种方法可以修复此错误。
例如我有以下数据
let listValue = ["cafeaawewqeqwewqweqweqweeqeeqweqweqweqwe", "pub", "motorcycle", "laundrette", "bar", "to walk", "embassy"]
第一个使用
absolute
宽度。意思是Dimension with an absolute point value
let layoutSize = NSCollectionLayoutSize(widthDimension: .absolute(50), heightDimension: .estimated(20))
第二个使用
fractionalWidth
。意思是Dimension is computed as a fraction of the width of the containing group.
let layoutSize = NSCollectionLayoutSize(widthDimension: .fractionalWidth(0.5), heightDimension: .estimated(20))