9

我正在尝试在集合视图单元格上设置零填充,我已将视图控制器上的“最小间距”设置为:

在此处输入图像描述

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

在此处输入图像描述

我也希望单元格根据框架的宽度很好地包裹,例如每个单元格是 50px 宽,所以如果有六个单元格并且我将框架宽度设置为 150px,它将显示两行三细胞。

但是,如果我通过执行以下操作将框架宽度设置为 150:

- (void)viewDidLoad
{
    [super viewDidLoad];

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

它看起来像上面的屏幕截图(太宽)。

如果我将它设置为小得可笑的值,例如 10,它会在某种程度上包装:

在此处输入图像描述

UICollectionViewCell 设置为 50 x 50:

在此处输入图像描述

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

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

我已经禁用了自动布局,以防万一有任何干扰。关于如何移除填充并根据框架宽度/高度将它们包裹起来的任何建议?

4

4 回答 4

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];
于 2013-01-03T21:26:04.563 回答
3

您正在使用 UICollectionViewController,它与 UITableViewController 一样,具有集合视图(或表视图)作为view视图控制器的基本属性。这意味着它不能在视图控制器中调整大小;它的大小由它的超级视图控制——在这种情况下,它可以是作为根视图控制器的窗口,也可以是嵌入它的父视图控制器。

如果要缩小集合视图区域以使单元格彼此邻接,则可以在情节提要中修改集合视图的部分插图。在您的情况下,左右插入 15 个单元将单元格组合在一起 - 这是 9 * 50 (450) 加上 30 = 480,这是横向 3.5 英寸 iPhone 的宽度。

显然,这在 iPhone 5 或 iPad 中会有所不同。您可以在运行时计算插入,使用标准 UIViewController 子类中保存的集合视图,或者将 UICollectionViewController 保存为嵌入式视图控制器。后两者将使您只需指定一个大小,这可能比计算插图更好。

于 2013-01-03T22:32:13.607 回答
3

在你的 ViewController 中实现这个方法

- (CGFloat)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout minimumLineSpacingForSectionAtIndex:(NSInteger)section
{
   return 2; //the spacing between cells is 2 px here
}
于 2013-12-19T11:00:45.537 回答
0

minimumInteritemSpacing 就是一个最小值,所以如果 UICollectionViewLayout 类决定它需要它可以更大

要纠正这一点,您可以创建自己的布局子类,并实现该- (UICollectionViewLayoutAttributes *)layoutAttributesForItemAtIndexPath:(NSIndexPath *)indexPath方法,类似于此问题的答案(请参阅第二个问题,而不是标记为正确的问题)

- (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;
}
于 2013-01-03T21:54:48.650 回答