Swift CollectionView自定义布局单元格间距

时间:2016-12-02 06:26:57

标签: ios iphone swift uicollectionview uicollectionviewcell

我正在关注GitHub source以实现CustomCollectionViewLayout,当我在单元格之间添加空格时会出现问题,但像minimumLineSpacingForSectionAtIndex和设置边缘插入函数这样的函数甚至没有调用委托已设置。请告诉我如何在每列之间设置空间,因为我需要在第一列之后的空间为15,在其他列之后需要10的空格。

这是我迄今取得的成就:

enter image description here

class DemoGraphicCollectionViewLayout: UICollectionViewLayout {

    var numberOfColumns : Int = 0
    var itemAttributes : NSMutableArray!
    var itemsSize : NSMutableArray!
    var contentSize : CGSize!

    override func prepare() {
        if self.collectionView?.numberOfSections == 0 {
            return
        }

        if (self.itemAttributes != nil && self.itemAttributes.count > 0) {
            for section in 0..<self.collectionView!.numberOfSections {
                let numberOfItems : Int = self.collectionView!.numberOfItems(inSection: section)
                for index in 0..<numberOfItems {
                    if section != 0 && index != 0 {
                        continue
                    }

                    let attributes : UICollectionViewLayoutAttributes = self.layoutAttributesForItem(at: IndexPath(item: index, section: section))
                    if section == 0 {
                        var frame = attributes.frame
                        frame.origin.y = self.collectionView!.contentOffset.y
                        attributes.frame = frame
                    }

                    if index == 0 {
                        var frame = attributes.frame
                        frame.origin.x = self.collectionView!.contentOffset.x
                        attributes.frame = frame
                    }
                }
            }
            return
        }

        if (self.itemsSize == nil || self.itemsSize.count != numberOfColumns) {
            self.calculateItemsSize()
        }

        var column = 0
        var xOffset : CGFloat = 0
        var yOffset : CGFloat = 0
        var contentWidth : CGFloat = 0
        var contentHeight : CGFloat = 0
        numberOfColumns = (collectionView?.numberOfSections)!
        for section in 0..<self.collectionView!.numberOfSections {
            let sectionAttributes = NSMutableArray()

            for index in 0..<numberOfColumns {
                var itemSize = (self.itemsSize[index] as AnyObject).cgSizeValue
                let indexPath = IndexPath(item: index, section: section)
                let attributes = UICollectionViewLayoutAttributes(forCellWith: indexPath)
                attributes.frame = CGRect(x: xOffset, y: yOffset, width: (itemSize?.width)!, height: (itemSize?.height)!).integral

                if section == 0 {
                    itemSize = CGSize(width: 150, height: 30)
                }


                if section == 0 && index == 0 {
                    attributes.zIndex = 1024;
                } else  if section == 0 || index == 0 {
                    attributes.zIndex = 1023
                }

                if section == 0 {
                    var frame = attributes.frame
                    frame.origin.y = self.collectionView!.contentOffset.y
                    frame.size.height = 30
                    attributes.frame = frame
                }
                if index == 0 {
                    var frame = attributes.frame
                    frame.origin.x = self.collectionView!.contentOffset.x
                    attributes.frame = frame
                }

                sectionAttributes.add(attributes)

                xOffset += (itemSize?.width)!
                column += 1

                if column == numberOfColumns {
                    if xOffset > contentWidth {
                        contentWidth = xOffset
                    }

                    column = 0
                    xOffset = 0
                    yOffset += (itemSize?.height)!
                }
            }
            if (self.itemAttributes == nil) {
                self.itemAttributes = NSMutableArray(capacity: self.collectionView!.numberOfSections)
            }
            self.itemAttributes .add(sectionAttributes)
        }

        let attributes : UICollectionViewLayoutAttributes = (self.itemAttributes.lastObject as AnyObject).lastObject as! UICollectionViewLayoutAttributes

        contentHeight = attributes.frame.origin.y + attributes.frame.size.height
        self.contentSize = CGSize(width: contentWidth, height: CGFloat(0))
    }

    override var collectionViewContentSize : CGSize {
        return self.contentSize
    }


    override func layoutAttributesForItem(at indexPath: IndexPath) -> UICollectionViewLayoutAttributes {


        let aa = self.itemAttributes[indexPath.section] as! NSMutableArray
        return aa[indexPath.row] as! UICollectionViewLayoutAttributes

    }

    override func layoutAttributesForElements(in rect: CGRect) ->[UICollectionViewLayoutAttributes]? {
        var attributes = [UICollectionViewLayoutAttributes]()



        if let itemAttributes = self.itemAttributes as NSArray as? [[UICollectionViewLayoutAttributes]] {
            for section in itemAttributes {
                let filteredArray = section.filter {evaluatedObject in
                    return rect.intersects(evaluatedObject.frame)
                }
                attributes.append(contentsOf: filteredArray)
            }
        }
        return attributes
    }

    override func shouldInvalidateLayout(forBoundsChange newBounds: CGRect) -> Bool {
        return true
    }

    func sizeForItemWithColumnIndex(_ columnIndex: Int) -> CGSize {


        return CGSize(width: 150, height: 130)
    }

    func calculateItemsSize() {
        self.itemsSize = NSMutableArray(capacity: (collectionView?.numberOfSections)!)
        for index in 0..<(collectionView?.numberOfSections)! {
            self.itemsSize.add(NSValue(cgSize: self.sizeForItemWithColumnIndex(index)))
        }
    }
}

2 个答案:

答案 0 :(得分:0)

试试这段代码。您只需要使用自定义视图替换UIImageView对象。

https://github.com/krishnads/KConfigurableCollectionViewDemo

答案 1 :(得分:0)

好吧,我已经测试了第三方库的代码,我也遇到了类似的问题,即我的委托方法没有调用。在调查这个问题时,我发现:

方法minimumInteritemSpacingForSectionAtUICollectionViewDelegateFlowLayout使用的UICollectionViewFlowLayout的一部分。 CustomCollectionLayoutUICollectionViewLayout的子类,而不是UICollectionViewFlowLayout的子类。这就是没有调用委托方法的原因。

您有机会按照源链接中提到的prepare方法调整布局。不幸的是,我没有足够的时间来实施它,但我希望你会找到一些解决方案。

Here I found this info