0

如下图所示,我有一个 UICollectionViewCell,其中包含一个具有固定高度图像的 UIImageView。在 UIImageView 下方有一个垂直的 UIStackView,其中包含所有标签和带有标题、价格的子堆栈视图,例如

在此处输入图像描述

导致图像的 2 列网格的组合布局部分是这样的:

func createSection() -> NSCollectionLayoutSection {
    // Layout configuration values
    let cellHeight = CGFloat(205.0)
    let sectionTopSpacing = CGFloat(12.0)
    let sectionLeadingSpacing = CGFloat(12.0)
    let sectionTrailingSpacing = CGFloat(12.0)
    let sectionBottomSpacing = CGFloat(12.0)
    let numberOfColumns = UIDevice.current.userInterfaceIdiom == .pad ? 4 : 2
    let interItemSpacing = CGFloat(8.0)
    let interGroupSpacing = CGFloat(8.0)
    // Item
    let itemSize = NSCollectionLayoutSize(widthDimension: .fractionalWidth(1.0),
                                          heightDimension: .estimated(cellHeight))
    
    let item = NSCollectionLayoutItem(layoutSize: itemSize)
    
    // Group
    let groupSize = NSCollectionLayoutSize(widthDimension: .fractionalWidth(1.0),
                                           heightDimension: .estimated(cellHeight))
    let group = NSCollectionLayoutGroup.horizontal(layoutSize: groupSize,
                                                   subitem: item,
                                                   count: numberOfColumns)
    group.interItemSpacing = .fixed(interItemSpacing)
    
    // Section
    let section = NSCollectionLayoutSection(group: group)
    section.interGroupSpacing = interGroupSpacing
    section.contentInsets = NSDirectionalEdgeInsets(top: sectionTopSpacing,
                                                    leading: sectionLeadingSpacing,
                                                    bottom: sectionBottomSpacing,
                                                    trailing: sectionTrailingSpacing)
    return section
}

我已经为垂直堆栈视图及其标签尝试了几种抗压性和拥抱优先级值。

任何想法如何根据该组的最高项目使同一组的项目具有相同的高度都将非常受欢迎。

非常感谢您!

4

1 回答 1

0

伙计,我已经通过将 layoutAttributesForItem 中的高度调整为最大值(在 indexPath:IndexPath)中使用自定义 UICollectionViewCompositionalLayout 子类来管理它。此外,如果您有多个部分,您也需要调整其项目的 y 位置。为简单起见,我将删除这部分。

    override func layoutAttributesForElements(in rect: CGRect) -> [UICollectionViewLayoutAttributes]? {
        let allAttributes = super.layoutAttributesForElements(in: rect)

        return allAttributes?.compactMap { attributes in
            switch attributes.representedElementCategory {
                case .cell:
                    return layoutAttributesForItem(at: attributes.indexPath)

                default:
                    return attributes
            }
        }
    }


    override func layoutAttributesForItem(at indexPath: IndexPath) -> UICollectionViewLayoutAttributes? {
        let attributes = super.layoutAttributesForItem(at: indexPath)?.copy() as? UICollectionViewLayoutAttributes

        guard let frame = attributes?.frame else {
            return attributes
        }

            if frame.height > maxHeight {
                maxHeight = frame.height
            }
            
            attributes?.frame.size = CGSize(
                width: frame.width,
                height: maxHeight
            )

        return attributes

}


    private var maxHeight = CGFloat.zero
于 2021-12-22T13:13:40.877 回答