2

用例:

  • 我有一个UICollectionView要展示的产品,让我们称之为productsViewCollection(只有一行有多个ProductCells)。
  • 每个ProductCell可能有不同的高度,但它们都具有相同的宽度。
  • ProductCell可以在运行时添加。
  • 我正在根据 s 使用自动调整大小的单元AutoLayoutProductCell
  • 我有UICollectionViewFlowLayout自定义类来使产品单元对齐顶部。

    class TopLayout : UICollectionViewFlowLayout {
    
    override func awakeFromNib() {
        super.awakeFromNib();
        self.scrollDirection = .horizontal;
    }
    
    override func layoutAttributesForElements(in rect: CGRect) -> [UICollectionViewLayoutAttributes]? {
        let attributesArray = super.layoutAttributesForElements(in: rect);
    
        if attributesArray != nil {
            for attributes in attributesArray! {
                if (attributes.representedElementKind == nil) {
                    let rect : CGRect? = self.layoutAttributesForItem(at: attributes.indexPath)?.frame;
                    if (rect != nil) {
                        attributes.frame = rect!;
                    }
                }
            }
        }
    
        return attributesArray;
    }
    
    override func layoutAttributesForItem(at indexPath: IndexPath) -> UICollectionViewLayoutAttributes? {
        let attributes = super.layoutAttributesForItem(at: indexPath);
        //let sectionInset : UIEdgeInsets = (self.collectionView?.collectionViewLayout as! UICollectionViewFlowLayout).sectionInset;
    
        if (indexPath.item >= 0) {
            attributes?.frame.origin.y = 0;
        }
        return attributes;
    }}
    

问题是什么?

  • (1) 我没有找到确定高度的方法productsCollectionView
  • (2) 我没有找到强制productsCollectionView只显示一行的方法。
  • (3)ProductCellproductsCollectionView前导中插入一个新的滚动到第一个项目!,我需要将它保持在相同的位置。

我试过什么?

  • 尝试问题(1):
    • 确定没有高度的宽度是行不通的,因为我需要确定高度,productsCollectionView否则ProductCells 不会出现。
    • 因此我尝试设置高度约束,但应用程序崩溃了"The behavior of the UICollectionViewFlowLayout is not defined because the item height must be less than the height of the UICollectionView minus the section insets top and bottom values, minus the content insets top and bottom values."productsCollectionView没有插图(水平 UICollectionView 单行布局)。
    • 我也尝试使用collectionView.contentSize高度约束来确定高度,productsCollectionView但它不起作用,因为即使您调用layoutIfNeeded或任何类似方法,它也不会具有最终计算的大小(如何使用 FlowLayout和许多其他链接确定 UICollectionView 的高度) .
    • 我也尝试使用collectionView.collectionViewlayout.collectionViewContentSize高度约束来确定高度,productsCollectionView但它不起作用,它会正确计算宽度,而高度将根据AutoLayout约束而不是最大ProductCell高度来确定,所以我没有找到自动确定高度的方法(如何使用 FlowLayout和许多其他链接确定 UICollectionView 的高度)。
    • 因此,最后我尝试根据ProductCells 最大高度手动更改高度,我为 设置了更大的高度约束,productsViewCollection并在MyViewController我调用layoutAttributesForItem了 中的每个项目productsViewCollection来计算每个ProductCell高度。
    • 它起作用了,但是如果我需要插入任何其他产品,我应该做同样的事情,但这也会导致 UI 中的错误行为,productsCollectionView它将扩展几毫秒然后正确裁剪:(。
  • 尝试问题(2):
    • 当然,我将其设置为水平,但这还不够,如果产品高度的总和小于productsCollectionView高度(在 UICollectionView - Swift 中显示一行),流程布局会将产品添加到同一列。
    • 所以我尝试为minimumInteritemSpacing它设置更大的值,但不是 100% 正确,它会在最后添加额外的空间(UICollectionView: One Row 或 Column)。
    • 我试图在方法中使用自定义类使ProductCell高度与高度相同,但它不起作用,高度改变了但同一列的单元格,我不知道为什么!productsCollectionViewUICollectionViewFlowLayoutlayoutAttributesForItem
  • 尝试问题(3):
    • 我不知道为什么插入新项目会导致滚动,有时是第一个项目,有时是几个项目之前,有时它与奇怪的调整大小动画一起正常工作!无论如何,我试图禁用我的调整大小productsCollectionView代码,但什么也没发生。
    • 我试图保存当前productsCollectionView.contentOffset然后应用它,它只有在我将animated参数设置为时才有效true,否则它将是未指定的滚动。

注意: 对不起,我的英语不好,谢谢。

4

0 回答 0