一尘不染

UICollectionView 中的单元格间距

ios

如何在部分中设置单元格间距UICollectionView?我知道有一个属性minimumInteritemSpacing我已将其设置为 5.0,但间距未显示为 5.0。我已经实现了 flowout 委托方法。

- (CGFloat)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout minimumInteritemSpacingForSectionAtIndex:(NSInteger)section
{

    return 5.0;
}

我仍然没有得到想要的结果。我认为它的最小间距。有没有什么办法可以设置最大间距?

模拟器 sc


阅读 188

收藏
2022-05-11

共2个答案

一尘不染

我知道这个话题很老了,但如果有人仍然需要正确的答案,你需要什么:

  1. 覆盖标准流程布局。

  2. 添加这样的实现:

```objectivec
- (NSArray ) layoutAttributesForElementsInRect:(CGRect)rect {
NSArray
answer = [super layoutAttributesForElementsInRect:rect];

   for(int i = 1; i < [answer count]; ++i) {
       UICollectionViewLayoutAttributes *currentLayoutAttributes = answer[i];
       UICollectionViewLayoutAttributes *prevLayoutAttributes = answer[i - 1];
       NSInteger maximumSpacing = 4;
       NSInteger origin = CGRectGetMaxX(prevLayoutAttributes.frame);

       if(origin + maximumSpacing + currentLayoutAttributes.frame.size.width < self.collectionViewContentSize.width) {
           CGRect frame = currentLayoutAttributes.frame;
           frame.origin.x = origin + maximumSpacing;
           currentLayoutAttributes.frame = frame;
       }
   }
   return answer;

}
```

其中 maximumSpacing 可以设置为您喜欢的任何值。这个技巧保证单元格之间的空间将完全等于maximumSpacing!

2022-05-11
一尘不染

支持最初的问题。我试图将间距设置为 5px,UICollectionView但这不起作用,以及UIEdgeInsetsMake(0,0,0,0)

在 UITableView 上,我可以通过直接连续指定 x,y 坐标来做到这一点......

在此处输入图像描述

这是我的 UICollectionView 代码:

#pragma mark collection view cell layout / size
- (CGSize)collectionView:(UICollectionView*)collectionView layout:(UICollectionViewLayout *)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath {
    return [self getCellSize:indexPath];  // will be w120xh100 or w190x100
    // if the width is higher, only one image will be shown in a line
}

#pragma mark collection view cell paddings
- (UIEdgeInsets)collectionView:(UICollectionView*)collectionView layout:(UICollectionViewLayout *)collectionViewLayout insetForSectionAtIndex:(NSInteger)section {
    return UIEdgeInsetsMake(0, 0, 0, 0); // top, left, bottom, right
}

- (CGFloat)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout minimumInteritemSpacingForSectionAtIndex:(NSInteger)section {

    return 5.0;
}

更新:使用以下代码解决了我的问题。

在此处输入图像描述

视图控制器.m

#import "ViewController.h"
#import "MagazineCell.h" // created just the default class. 

static NSString * const cellID = @"cellID";

@interface ViewController ()

@end

@implementation ViewController

#pragma mark - Collection view
-(NSInteger)numberOfSectionsInCollectionView:(UICollectionView *)collectionView
{
    return 1;
}
-(NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section
{
    return 30;
}

-(UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
{
    MagazineCell *mCell = (MagazineCell *)[collectionView dequeueReusableCellWithReuseIdentifier:cellID forIndexPath:indexPath];

    mCell.backgroundColor = [UIColor lightGrayColor];

    return mCell;
}

#pragma mark Collection view layout things
// Layout: Set cell size
- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath {

    NSLog(@"SETTING SIZE FOR ITEM AT INDEX %d", indexPath.row);
    CGSize mElementSize = CGSizeMake(104, 104);
    return mElementSize;
}
- (CGFloat)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout minimumInteritemSpacingForSectionAtIndex:(NSInteger)section {
    return 2.0;
}

- (CGFloat)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout minimumLineSpacingForSectionAtIndex:(NSInteger)section {
    return 2.0;
}

// Layout: Set Edges
- (UIEdgeInsets)collectionView:
(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout insetForSectionAtIndex:(NSInteger)section {
   // return UIEdgeInsetsMake(0,8,0,8);  // top, left, bottom, right
    return UIEdgeInsetsMake(0,0,0,0);  // top, left, bottom, right
}

@end
2022-05-11