UICollectionViewCell填充

时间:2013-01-03 18:58:35

标签: objective-c uicollectionview uicollectionviewcell

我试图在集合视图单元格上设置零填充,我在视图控制器上设置了“Min Spacing”:

enter image description here

然而,细胞之间仍然存在差距:

enter image description here

另外我喜欢它,以便细胞根据框架的宽度很好地包裹,例如每个单元格宽50px,所以如果有六个单元格并且我将框架宽度设置为150px,它将显示两个三个细胞系。

然而,如果我通过执行以下操作将帧宽设置为150:

- (void)viewDidLoad
{
    [super viewDidLoad];

    CGRect frame = self.collectionView.frame;
    frame.size.width = 150;
    self.collectionView.frame = frame;
}

在上面的屏幕截图中显示(太宽)。

如果我将它设置为像10这样可笑的小东西,它会在某种程度上包裹起来:

enter image description here

UICollectionViewCell设置为50 x 50:

enter image description here

我还尝试以编程方式设置单元格的大小,还删除了UIEdgeInset:

- (UIEdgeInsets)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout insetForSectionAtIndex:(NSInteger)section {
    return UIEdgeInsetsMake(0, 0, 0, 0);
}

我已禁用自动布局,只是因为有任何干扰。有关如何移除衬垫并根据框架宽度/高度进行包装的任何建议吗?

3 个答案:

答案 0 :(得分:3)

我不确定截图中的细胞是50x50(编辑:我猜他们是......)。

检查您是否连接了UICollectionViewDelegate和UICollectionViewDataSource。

这是你需要实施的方法

- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath {
    CGSize retval = CGSizeMake(50, 50);
    return retval;
}

如果不起作用,请尝试将此代码放在viewDidLoad

UICollectionViewFlowLayout *flowLayout = [[UICollectionViewFlowLayout alloc] init];
[flowLayout setMinimumInteritemSpacing:0.0f];
[flowLayout setMinimumLineSpacing:0.0f];
[flowLayout setItemSize:CGSizeMake(50.0f, 50.0f)];
[self.collectionView setCollectionViewLayout:flowLayout];

答案 1 :(得分:3)

在ViewController中实现此方法

- (CGFloat)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout minimumLineSpacingForSectionAtIndex:(NSInteger)section
{
   return 2; //the spacing between cells is 2 px here
}

答案 2 :(得分:0)

minimumInteritemSpacing就是最小值,因此如果UICollectionViewLayout类决定它需要是

,它可以更大

为了纠正这个问题,您可以创建自己的布局子类,并实现- (UICollectionViewLayoutAttributes *)layoutAttributesForItemAtIndexPath:(NSIndexPath *)indexPath方法,类似this question的答案(参见第二个问题,而不是标记为正确的问题)

- (UICollectionViewLayoutAttributes *)layoutAttributesForItemAtIndexPath:(NSIndexPath *)indexPath {
    UICollectionViewLayoutAttributes* atts =
    [super layoutAttributesForItemAtIndexPath:indexPath];

    if (indexPath.item == 0) // degenerate case 1, first item of section
        return atts;

    NSIndexPath* ipPrev =
    [NSIndexPath indexPathForItem:indexPath.item-1 inSection:indexPath.section];

    CGRect fPrev = [self layoutAttributesForItemAtIndexPath:ipPrev].frame;
    CGFloat rightPrev = fPrev.origin.x + fPrev.size.width + 10;
    if (atts.frame.origin.x <= rightPrev) // degenerate case 2, first item of line
        return atts;

    CGRect f = atts.frame;
    f.origin.x = rightPrev;
    atts.frame = f;
    return atts;
}