我试图在集合视图单元格上设置零填充,我在视图控制器上设置了“Min Spacing”:
然而,细胞之间仍然存在差距:
另外我喜欢它,以便细胞根据框架的宽度很好地包裹,例如每个单元格宽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);
}
我已禁用自动布局,只是因为有任何干扰。有关如何移除衬垫并根据框架宽度/高度进行包装的任何建议吗?
答案 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;
}