UICollectionViewCompositionalLayout 水平,使用估计和不水平拥抱时不计算内容的宽度
UICollectionViewCompositionalLayout horizontal, not calculating width of content when using estimated and not horizontally hugging
I want the cell to horizontaly Hug its content
我在水平模式下使用 UICollectionViewCompositionalLayout
并且 widthDimension: .estimated(100)
应该计算内容大小
但单元格/组的宽度根本不是根据内容大小计算的
并设置为估计值,因为它是绝对值
即使向标签添加宽度限制也不会影响单元格大小
这是预期的行为吗?如果是,那为什么?以及如何得到想要的结果?
class LabelCell: UICollectionViewCell {
@IBOutlet weak var label: UILabel!
}
class ViewController: UIViewController, UICollectionViewDataSource {
func buildLayout() -> UICollectionViewCompositionalLayout {
let itemSize = NSCollectionLayoutSize(widthDimension: .estimated(100), heightDimension: .absolute(32))
let item = NSCollectionLayoutItem(layoutSize: itemSize)
let groupSize = NSCollectionLayoutSize(widthDimension: .estimated(100), heightDimension: .absolute(32))
let group = NSCollectionLayoutGroup.horizontal(layoutSize: groupSize, subitem: item, count: 1)
let section = NSCollectionLayoutSection(group: group)
section.interGroupSpacing = 10
let configuration = UICollectionViewCompositionalLayoutConfiguration()
configuration.scrollDirection = .horizontal
return UICollectionViewCompositionalLayout(section: section, configuration: configuration)
}
@IBOutlet weak var collectionView: UICollectionView!
let items = ["1", "12", "12345", "123456789"]
override func viewDidLoad() {
super.viewDidLoad()
collectionView.collectionViewLayout = buildLayout()
}
func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
return items.count
}
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
let c = collectionView.dequeueReusableCell(withReuseIdentifier: "LabelCell", for: indexPath) as! LabelCell
c.label.text = items[indexPath.row]
return c
}
}
要正确调整单元格大小,请更改:
let group = NSCollectionLayoutGroup.horizontal(layoutSize: groupSize, subitem: item, count: 1)
为此:
let group = NSCollectionLayoutGroup.horizontal(layoutSize: groupSize, subitems: [item])
我不确定为什么需要进行此更改,因为这些行似乎在表达相同的意思。也就是说,只要您的集合视图单元格通过覆盖 sizeThatFits(_:)
、preferredLayoutAttributesFitting(_:)
、使用自动布局等指定实际单元格大小,它就可以工作
关于它的价值,第一个函数签名的文档说:
Specifies a group that will have N items equally sized along the horizontal axis.
第二个函数签名的注释没有对大小相同的项目提出此类声明。它说:
Specifies a group that will repeat items until available horizontal space is exhausted.
I want the cell to horizontaly Hug its content
我在水平模式下使用 UICollectionViewCompositionalLayout
并且 widthDimension: .estimated(100)
应该计算内容大小
但单元格/组的宽度根本不是根据内容大小计算的 并设置为估计值,因为它是绝对值
即使向标签添加宽度限制也不会影响单元格大小
这是预期的行为吗?如果是,那为什么?以及如何得到想要的结果?
class LabelCell: UICollectionViewCell {
@IBOutlet weak var label: UILabel!
}
class ViewController: UIViewController, UICollectionViewDataSource {
func buildLayout() -> UICollectionViewCompositionalLayout {
let itemSize = NSCollectionLayoutSize(widthDimension: .estimated(100), heightDimension: .absolute(32))
let item = NSCollectionLayoutItem(layoutSize: itemSize)
let groupSize = NSCollectionLayoutSize(widthDimension: .estimated(100), heightDimension: .absolute(32))
let group = NSCollectionLayoutGroup.horizontal(layoutSize: groupSize, subitem: item, count: 1)
let section = NSCollectionLayoutSection(group: group)
section.interGroupSpacing = 10
let configuration = UICollectionViewCompositionalLayoutConfiguration()
configuration.scrollDirection = .horizontal
return UICollectionViewCompositionalLayout(section: section, configuration: configuration)
}
@IBOutlet weak var collectionView: UICollectionView!
let items = ["1", "12", "12345", "123456789"]
override func viewDidLoad() {
super.viewDidLoad()
collectionView.collectionViewLayout = buildLayout()
}
func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
return items.count
}
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
let c = collectionView.dequeueReusableCell(withReuseIdentifier: "LabelCell", for: indexPath) as! LabelCell
c.label.text = items[indexPath.row]
return c
}
}
要正确调整单元格大小,请更改:
let group = NSCollectionLayoutGroup.horizontal(layoutSize: groupSize, subitem: item, count: 1)
为此:
let group = NSCollectionLayoutGroup.horizontal(layoutSize: groupSize, subitems: [item])
我不确定为什么需要进行此更改,因为这些行似乎在表达相同的意思。也就是说,只要您的集合视图单元格通过覆盖 sizeThatFits(_:)
、preferredLayoutAttributesFitting(_:)
、使用自动布局等指定实际单元格大小,它就可以工作
关于它的价值,第一个函数签名的文档说:
Specifies a group that will have N items equally sized along the horizontal axis.
第二个函数签名的注释没有对大小相同的项目提出此类声明。它说:
Specifies a group that will repeat items until available horizontal space is exhausted.