如何在 UICollectionView(组合布局)中强制 UILabel 单元格的断线

问题描述 投票:0回答:1

我有一个 UICollectionView,充当标签列表。

它采用水平构图布局。

这是截图:list of tags

我的问题是,如果我的标签比集合的宽度长,它会崩溃并出现以下错误:

错误:使用指定的间距和大小的无效组合创建 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 分成多行?

ios swift uicollectionview autolayout uicollectionviewlayout
1个回答
0
投票

查看您的

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)) 

First

第二个使用

fractionalWidth
。意思是
Dimension is computed as a fraction of the width of the containing group.

let layoutSize = NSCollectionLayoutSize(widthDimension: .fractionalWidth(0.5), heightDimension: .estimated(20))

Second

了解更多

© www.soinside.com 2019 - 2024. All rights reserved.