UICollectionView 布局间距问题。单元格之间的空间太大

Posted

技术标签:

【中文标题】UICollectionView 布局间距问题。单元格之间的空间太大【英文标题】:UICollectionView layout spacing issues. Spaces between cells is way too large 【发布时间】:2012-12-12 16:29:59 【问题描述】:

我正在以编程方式设置我的UICollectionView,一切看起来都对我来说是正确的,但是当我测试我的应用程序时,我得到了一些非常奇怪的间距,无论是垂直还是水平。我的 LibraryViewController 类设置了集合视图,可以在这里找到:LibaryViewController class。我的LibraryCell init 看起来像这样:

- (id)initWithFrame:(CGRect)frame

NSLog(@"Init called");
NSLog(@"%@", NSStringFromCGRect(frame));
self = [super initWithFrame:frame];
if (self) 
    // Initialization code
    imageView = [[UIImageView alloc] initWithFrame:frame];
    [self.contentView addSubview:imageView];

return self;

所以每次设置单元格时,我都会让它向我报告框架是什么。有趣的是这些值看起来是正确的。以下是我的日志文件中显示帧位于正确位置的部分:

2012-12-12 11:08:48.333 ARApp2[16330:907] Init called
2012-12-12 11:08:48.335 ARApp2[16330:907] 10, 10, 80, 120
2012-12-12 11:08:48.341 ARApp2[16330:907] Loaded image0.png
2012-12-12 11:08:48.349 ARApp2[16330:907] success
2012-12-12 11:08:48.352 ARApp2[16330:907] Init called
2012-12-12 11:08:48.354 ARApp2[16330:907] 120, 10, 80, 120
2012-12-12 11:08:48.358 ARApp2[16330:907] Loaded image1.png
2012-12-12 11:08:48.365 ARApp2[16330:907] success
2012-12-12 11:08:48.368 ARApp2[16330:907] Init called
2012-12-12 11:08:48.370 ARApp2[16330:907] 230, 10, 80, 120
2012-12-12 11:08:48.375 ARApp2[16330:907] Loaded image2.png
2012-12-12 11:08:48.382 ARApp2[16330:907] success

但是当你查看屏幕上的结果时,它看起来像这样:Screenshot 这个集合有四个项目。前三个在第一排,所以你甚至看不到第三个。然后第四个开始下一行,但比我想要的要低得多。谁能明白为什么这些细胞间隔如此之远?

【问题讨论】:

这里的“自我”是什么?你在调用什么对象的 initWithFrame ?您是否知道视图的子视图有自己的坐标系,从 (0,0) 开始?如果这个对象(我想是某个 UIView 子类)的框架为 10,10 和(某事,某事),并且您添加一个带有 (10, 10) 和(某事,某事)的子视图,那么您的子视图将从 (20, 20)。您的第二个子视图将在您的“自我”的父视图的坐标系内从 (240, 20) 开始。 【参考方案1】:

imageView = [[UIImageView alloc] initWithFrame:frame];

这条线似乎是你的问题。您的图像视图应该是 (0,0), (80,120) 但您将其超级视图的框架分配为图像的框架,因此您最终得到第二张图像的超级视图为 (120, 10), (80, 120) 但图像也有相同的偏移量和大小,这给了你疯狂的间距。

tl;dr,将你的 imageView 框架设置为 self.bounds,因为你的 imageView 应该占据整个 superview。

【讨论】:

或者使用 self.bounds,这是添加填充整个空间的子视图的正确方法。 你是对的,self.bounds 是正确的方法,因为每个图像都使用了整个帧。 谢谢!这确实是问题所在。 Self.bounds,而不是 self.view 边界 - 集合视图单元格已经是一个视图,它没有视图属性。

以上是关于UICollectionView 布局间距问题。单元格之间的空间太大的主要内容,如果未能解决你的问题,请参考以下文章

UICollectionView / FlowLayout

uicollectionview的间距列

iOS UICollectionView自定义流水布局(一)

UICollectionView 流布局没有固定的行高

自定义UICollectionLayout布局 —— UIKit之学习UICollectionView记录一《瀑布流》

ios UICollectionView简单说明