尝试通过使用UICollectionViewCompositionalLayout实现固定的高度,动态宽度环绕内容水平的UICollectionView的单元格

问题描述

https://stackoverflow.com/a/51231881/72437中,它展示了如何通过使用UICollectionView

在垂直UICollectionViewCompositionalLayout的单元格中实现全宽,动态高度

我们希望在水平UICollectionView上达到要求

  1. 固定高度44
  2. 最小宽度44
  3. 随着内容的增长,宽度应动态放大

这是我们的解决方案的样子

class MenuTabsView: UIView,UICollectionViewDelegate,UICollectionViewDataSource,UICollectionViewDelegateFlowLayout {
   
    lazy var collView: UICollectionView = {
        let itemSize = NSCollectionLayoutSize(
            widthDimension: NSCollectionLayoutDimension.estimated(44),heightDimension: NSCollectionLayoutDimension.fractionalHeight(1.0)
        )
        let item = NSCollectionLayoutItem(
            layoutSize: itemSize
        )
        item.contentInsets = NSDirectionalEdgeInsets(
            top: 0,leading: 0,bottom: 0,trailing: 1
        )
        let group = NSCollectionLayoutGroup.horizontal(
            layoutSize: itemSize,subitem: item,count: 1
        )
        let section = NSCollectionLayoutSection(group: group)
        
        let configuration = UICollectionViewCompositionalLayoutConfiguration()
        configuration.scrollDirection = .horizontal
        
        let layout = UICollectionViewCompositionalLayout(section: section,configuration: configuration)
        
        let cv = UICollectionView.init(frame: CGRect.zero,collectionViewLayout: layout)
        cv.showsHorizontalScrollIndicator = false
        cv.backgroundColor = .white
        cv.delegate = self
        cv.dataSource = self
        
        return cv
    }()

我们期望通过使用widthDimension: NSCollectionLayoutDimension.estimated(44),这是使像元宽度动态增长的关键。但是,这不符合预期。看起来像

enter image description here

我可以知道,如何使用UICollectionViewCompositionalLayout解决此问题?完整的可行项目位于https://github.com/yccheok/PageViewControllerWithTabs/tree/UICollectionViewCompositionalLayout


p / s

我们希望避免使用UICollectionViewDelegateFlowLayout method collectionView(_:layout:sizeForItemAt:)。那样,我们的单元格可能会变得复杂,除了UILabel之外,它还将包含其他视图。必须手动计算内容大小,将使解决方案不灵活且容易出错。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)