Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift Collectionview网格中的流布局和自动调整单元格大小_Swift_Uicollectionview_Autoresize_Uicollectionviewflowlayout - Fatal编程技术网

Swift Collectionview网格中的流布局和自动调整单元格大小

Swift Collectionview网格中的流布局和自动调整单元格大小,swift,uicollectionview,autoresize,uicollectionviewflowlayout,Swift,Uicollectionview,Autoresize,Uicollectionviewflowlayout,我需要在集合视图中以3xn的形式实现网格布局。一行3个单元格,可能有n行 CollectionView单元格有一个方形图像和两个标签。标签向左对齐 CollectionView应符合以下要求: CollectionView单元格必须具有相同的宽度,但可以具有不同的高度。(取决于标签) 单元格应与collectionView的左上角对齐。也就是说,一行中的所有单元格都应该从同一y点开始。如果一行中有一个单元格,它应该与最左边对齐 我设法得到了布局,但它有一些缺陷 在单元格行之间有一些多余的多余空间

我需要在集合视图中以3xn的形式实现网格布局。一行3个单元格,可能有n行

CollectionView单元格有一个方形图像和两个标签。标签向左对齐

CollectionView应符合以下要求:

  • CollectionView单元格必须具有相同的宽度,但可以具有不同的高度。(取决于标签)
  • 单元格应与collectionView的左上角对齐。也就是说,一行中的所有单元格都应该从同一y点开始。如果一行中有一个单元格,它应该与最左边对齐
  • 我设法得到了布局,但它有一些缺陷

  • 在单元格行之间有一些多余的多余空间
  • 添加更多剖面和/或补充视图时,布局不再有效
  • 我用了一些技巧来使用这个流程布局

    class MainCollectionViewFlowLayout: UICollectionViewFlowLayout {
        override func layoutAttributesForElements(in rect: CGRect) -> [UICollectionViewLayoutAttributes]? {
            
            let attr = super.layoutAttributesForElements(in: rect)
            var attributes = [UICollectionViewLayoutAttributes]()
            for itemAttributes in attr! {
                if let itemAttributesCopy = itemAttributes.copy() as? UICollectionViewLayoutAttributes {
                    // manipulate itemAttributesCopy
                    attributes.append(itemAttributesCopy)
                }
            }
            
            if attributes.count == 1 {
                
                // Set left align if only one element in collectionview
                if let currentAttribute = attributes.first {
                    currentAttribute.frame = CGRect(x: self.sectionInset.left, y: currentAttribute.frame.origin.y, width: currentAttribute.frame.size.width, height: currentAttribute.frame.size.height)
                }
            } else {
                var sectionHeight: CGFloat = 0
    
                attributes.forEach { layoutAttribute in
                    guard layoutAttribute.representedElementCategory == .supplementaryView else {
                        return
                    }
                    
                    if layoutAttribute.representedElementKind == UICollectionView.elementKindSectionHeader {
                        sectionHeight = layoutAttribute.frame.size.height
                    }
                }
                
                attributes.forEach { layoutAttribute in
                    guard layoutAttribute.representedElementCategory == .cell else {
                        return
                    }
    
                    if layoutAttribute.frame.origin.x == 0 {
                        sectionHeight = max(layoutAttribute.frame.minY, sectionHeight)
                    }
    
                    layoutAttribute.frame = CGRect(origin: CGPoint(x: layoutAttribute.frame.origin.x, y: sectionHeight), size: layoutAttribute.frame.size)
                }
            }
            return attributes
        }
        
        override func shouldInvalidateLayout(forBoundsChange newBounds: CGRect) -> Bool {
            return true
        }
    }
    
    
    这是一张说明布局的图片。如果有人能推荐任何替代解决方案或更好的解决方案,那就太好了