Cell spacing in UICollectionView

后端 未结 26 3238
旧巷少年郎
旧巷少年郎 2020-11-22 15:53

How do I set cell spacing in a section of UICollectionView? I know there is a property minimumInteritemSpacing I have set it to 5.0 still the spaci

相关标签:
26条回答
  • 2020-11-22 16:17

    Using a horizontal flow layout, I was also getting a 10 points spacing between cells. To remove the spacing I needed to set minimumLineSpacing as well as minimumInterItemSpacing to zero.

    UICollectionViewFlowLayout *flow = [[UICollectionViewFlowLayout alloc] init];
    flow.itemSize = CGSizeMake(cellWidth, cellHeight);
    flow.scrollDirection = UICollectionViewScrollDirectionHorizontal;
    flow.minimumInteritemSpacing = 0;
    flow.minimumLineSpacing = 0;
    

    Also, if all your cells are the same size, it's simpler and more efficient to set the property on the flow layout directly instead of using delegate methods.

    0 讨论(0)
  • 2020-11-22 16:19

    Please note the property name minimumInterItemSpacing . This will be the minimum spacing between the items not the exact spacing. If you set minimumInterItemSpacing to some value you can assure that spacing wont be a value less than that. But there is a chance get a higher value.

    Actually the spacing between items depends on several factors itemSize and sectionInset. Collection view dynamically place the contents based on these values. So you cannot assure the exact spacing. You should do some trial and error with sectionInset and minimumInterItemSpacing.

    0 讨论(0)
  • 2020-11-22 16:20

    I have a horizontal UICollectionView and subclassed UICollectionViewFlowLayout. The collection view has large cells, and only shows one row of them at a time, and the collection view fits the width of the screen.

    I tried iago849's answer and it worked, but then I found out I didn't even need his answer. For some reason, setting the minimumInterItemSpacing does nothing. The spacing between my items/cells can be entirely controlled by minimumLineSpacing.

    Not sure why it works this way, but it works.

    0 讨论(0)
  • 2020-11-22 16:20

    I have problem with the accepted answer, so I updated it, this is working for me:

    .h

    @interface MaxSpacingCollectionViewFlowLayout : UICollectionViewFlowLayout
    @property (nonatomic,assign) CGFloat maxCellSpacing;
    @end
    

    .m

    @implementation MaxSpacingCollectionViewFlowLayout
    
    - (NSArray *) layoutAttributesForElementsInRect:(CGRect)rect {
        NSArray *attributes = [super layoutAttributesForElementsInRect:rect];
    
        if (attributes.count <= 0) return attributes;
    
        CGFloat firstCellOriginX = ((UICollectionViewLayoutAttributes *)attributes[0]).frame.origin.x;
    
        for(int i = 1; i < attributes.count; i++) {
            UICollectionViewLayoutAttributes *currentLayoutAttributes = attributes[i];
            if (currentLayoutAttributes.frame.origin.x == firstCellOriginX) { // The first cell of a new row
                continue;
            }
    
            UICollectionViewLayoutAttributes *prevLayoutAttributes = attributes[i - 1];
            CGFloat prevOriginMaxX = CGRectGetMaxX(prevLayoutAttributes.frame);
            if ((currentLayoutAttributes.frame.origin.x - prevOriginMaxX) > self.maxCellSpacing) {
                CGRect frame = currentLayoutAttributes.frame;
                frame.origin.x = prevOriginMaxX + self.maxCellSpacing;
                currentLayoutAttributes.frame = frame;
            }
        }
        return attributes;
    }
    
    @end
    
    0 讨论(0)
  • 2020-11-22 16:22

    Try this code to ensure you have a spacing of 5px between each item:

    - (UIEdgeInsets)collectionView:(UICollectionView *) collectionView 
                            layout:(UICollectionViewLayout *) collectionViewLayout 
            insetForSectionAtIndex:(NSInteger) section {
    
        return UIEdgeInsetsMake(0, 0, 0, 5); // top, left, bottom, right
    }
    
    - (CGFloat)collectionView:(UICollectionView *) collectionView
                       layout:(UICollectionViewLayout *) collectionViewLayout
      minimumInteritemSpacingForSectionAtIndex:(NSInteger) section {    
        return 5.0;
    }
    
    0 讨论(0)
  • 2020-11-22 16:23

    Simple code for spacing

    let layout = collectionView.collectionViewLayout as! UICollectionViewFlowLayout
    layout.minimumInteritemSpacing = 10 // Some float value
    
    0 讨论(0)
提交回复
热议问题