How do you determine spacing between cells in UICollectionView flowLayout

后端 未结 12 1195
夕颜
夕颜 2020-11-29 15:32

I have a UICollectionView with a flow layout and each cell is a square. How do I determine the spacing between each cells on each row? I can\'t seem to find the appropriate

12条回答
  •  失恋的感觉
    2020-11-29 16:03

    The swift version of Chris solution.

    class PazLeftAlignedCollectionViewFlowLayout : UICollectionViewFlowLayout {
        var maxCellSpacing = 14.0
        override func layoutAttributesForElementsInRect(rect: CGRect) -> [AnyObject]? {
            if var attributesToReturn = super.layoutAttributesForElementsInRect(rect) as? Array {
                for attributes in attributesToReturn {
                    if attributes.representedElementKind == nil {
                        let indexPath = attributes.indexPath
                        attributes.frame = self.layoutAttributesForItemAtIndexPath(indexPath).frame;
                    }
                }
                return attributesToReturn;
            }
            return super.layoutAttributesForElementsInRect(rect)
        }
    
        override func layoutAttributesForItemAtIndexPath(indexPath: NSIndexPath) -> UICollectionViewLayoutAttributes! {
            let currentItemAttributes = super.layoutAttributesForItemAtIndexPath(indexPath)
    
            if let collectionViewFlowLayout = self.collectionView?.collectionViewLayout as? UICollectionViewFlowLayout {
                let sectionInset = collectionViewFlowLayout.sectionInset
                if (indexPath.item == 0) { // first item of section
                    var frame = currentItemAttributes.frame;
                    frame.origin.x = sectionInset.left; // first item of the section should always be left aligned
                    currentItemAttributes.frame = frame;
    
                    return currentItemAttributes;
                }
    
                let previousIndexPath = NSIndexPath(forItem:indexPath.item-1, inSection:indexPath.section)
                let previousFrame = self.layoutAttributesForItemAtIndexPath(previousIndexPath).frame;
                let previousFrameRightPoint = Double(previousFrame.origin.x) + Double(previousFrame.size.width) + self.maxCellSpacing
    
                let currentFrame = currentItemAttributes.frame
                var width : CGFloat = 0.0
                if let collectionViewWidth = self.collectionView?.frame.size.width {
                    width = collectionViewWidth
                }
                let strecthedCurrentFrame = CGRectMake(0,
                    currentFrame.origin.y,
                    width,
                    currentFrame.size.height);
    
                if (!CGRectIntersectsRect(previousFrame, strecthedCurrentFrame)) { // if current item is the first item on the line
                    // the approach here is to take the current frame, left align it to the edge of the view
                    // then stretch it the width of the collection view, if it intersects with the previous frame then that means it
                    // is on the same line, otherwise it is on it's own new line
                    var frame = currentItemAttributes.frame;
                    frame.origin.x = sectionInset.left; // first item on the line should always be left aligned
                    currentItemAttributes.frame = frame;
                    return currentItemAttributes;
                }
    
                var frame = currentItemAttributes.frame;
                frame.origin.x = CGFloat(previousFrameRightPoint)
                currentItemAttributes.frame = frame;
            }
            return currentItemAttributes;
        }
    }
    

    To use it do the following:

        override func viewDidLoad() {
        super.viewDidLoad()
        self.collectionView.collectionViewLayout = self.layout
    }
    var layout : PazLeftAlignedCollectionViewFlowLayout {
        var layout = PazLeftAlignedCollectionViewFlowLayout()
        layout.itemSize = CGSizeMake(220.0, 230.0)
        layout.minimumLineSpacing = 12.0
        return layout
    }
    

提交回复
热议问题