How do you determine spacing between cells in UICollectionView flowLayout

后端 未结 12 1199
夕颜
夕颜 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 15:59

    a swift version base on mokagio:https://github.com/fanpyi/UICollectionViewLeftAlignedLayout-Swift

    class UICollectionViewLeftAlignedLayout: UICollectionViewFlowLayout {
        override func layoutAttributesForElementsInRect(rect: CGRect) -> [UICollectionViewLayoutAttributes]? {
            let attributesToReturn = super.layoutAttributesForElementsInRect(rect)
            if let attributesToReturn = attributesToReturn {
                for attributes in attributesToReturn {
                    if attributes.representedElementKind == nil {
                        let indexpath = attributes.indexPath
                        if let attr = layoutAttributesForItemAtIndexPath(indexpath) {
                            attributes.frame = attr.frame
                        }
    
                    }
                }
            }
            return attributesToReturn
        }
    
        override func layoutAttributesForItemAtIndexPath(indexPath: NSIndexPath) -> UICollectionViewLayoutAttributes? {
            if  let currentItemAttributes = super.layoutAttributesForItemAtIndexPath(indexPath){
                let sectionInset = self.evaluatedSectionInsetForItemAtIndex(indexPath.section)
                let  isFirstItemInSection = indexPath.item == 0;
                let  layoutWidth = CGRectGetWidth(self.collectionView!.frame) - sectionInset.left - sectionInset.right;
    
                if (isFirstItemInSection) {
                    currentItemAttributes.leftAlignFrameWithSectionInset(sectionInset)
                    return currentItemAttributes
                }
    
                let  previousIndexPath = NSIndexPath(forItem: indexPath.item - 1, inSection: indexPath.section)
    
                let previousFrame = layoutAttributesForItemAtIndexPath(previousIndexPath)?.frame ?? CGRectZero
                let  previousFrameRightPoint = previousFrame.origin.x + previousFrame.width
                let currentFrame = currentItemAttributes.frame;
                let  strecthedCurrentFrame = CGRectMake(sectionInset.left,
                    currentFrame.origin.y,
                    layoutWidth,
                    currentFrame.size.height)
                // if the current frame, once left aligned to the left and stretched to the full collection view
                // widht intersects the previous frame then they are on the same line
                let  isFirstItemInRow = !CGRectIntersectsRect(previousFrame, strecthedCurrentFrame)
    
                if (isFirstItemInRow) {
                    // make sure the first item on a line is left aligned
                    currentItemAttributes.leftAlignFrameWithSectionInset(sectionInset)
                    return currentItemAttributes
                }
    
                var frame = currentItemAttributes.frame;
                frame.origin.x = previousFrameRightPoint + evaluatedMinimumInteritemSpacingForSectionAtIndex(indexPath.section)
                currentItemAttributes.frame = frame;
                return currentItemAttributes;
    
            }
            return nil
        }
        func evaluatedMinimumInteritemSpacingForSectionAtIndex(sectionIndex:Int) -> CGFloat {
            if let delegate = self.collectionView?.delegate as? UICollectionViewDelegateFlowLayout {
                if delegate.respondsToSelector("collectionView:layout:minimumInteritemSpacingForSectionAtIndex:") {
                    return delegate.collectionView!(self.collectionView!, layout: self, minimumInteritemSpacingForSectionAtIndex: sectionIndex)
    
                }
            }
            return self.minimumInteritemSpacing
    
        }
        func evaluatedSectionInsetForItemAtIndex(index: Int) ->UIEdgeInsets {
            if let delegate = self.collectionView?.delegate as? UICollectionViewDelegateFlowLayout {
                if  delegate.respondsToSelector("collectionView:layout:insetForSectionAtIndex:") {
                    return delegate.collectionView!(self.collectionView!, layout: self, insetForSectionAtIndex: index)
                }
            }
            return self.sectionInset
        }
    }
    

提交回复
热议问题