我已经将子流布局子类化,并在我的集合视图中将其设置为我的collectionViewLayout
。
然后我按如下方式设置布局:
- (id) init
{
if(self = [super init])
{
self.minimumInteritemSpacing = 11.0;
self.scrollDirection = UICollectionViewScrollDirectionVertical;
self.itemSize = CGSizeMake(64.0,32.0);
self.minimumLineSpacing = 10.0;
self.sectionInset = UIEdgeInsetsMake(11.0,95.0,11.0,11.0);
return self;
}
return nil;
}
95 + 64 + 11 + 64 + 11 + 64 + 11 = 320 - 我查了一下。 (那是一个留下的插图,3个单元格,2个空格和一个右边插图)
我有1个部分,72个项目,以及索引路径功能的单元格:
- (UICollectionViewCell*) collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
{
CustomCell *cell = [self.collectionView dequeueReusableCellWithReuseIdentifier:cellIdentifierForCustomCell forIndexPath:indexPath];
cell.mainLabel.text = [@(indexPath.item) stringValue];
return cell;
}
输出是这样的:
如您所见,每行只有2个单元格。此外,它不会显示每个第3个单元格。
我看了一下流布局的布局函数是什么产生的
- (NSArray *)layoutAttributesForElementsInRect:(CGRect)rect {
...给出
这是layoutAttributes [NSArray]
中的前3个布局属性,你可以看到它已经决定只将前2个然后第4个项目视为rect(320 by 568)可见。这必须是集合视图布局中的错误,不是吗?集合视图填充屏幕,宽320。因此,由于这是一个换行符布局,因此屏幕上不应有任何项目。
删除了边缘插图:
它按预期工作。但是我想要部分插入,因为我需要添加一些需要在同一个滚动视图中的装饰视图,而我需要比右插入更大的lleft插入。
答案 0 :(得分:1)
Apple的UICollectionViewFlowLayout中存在一个错误,其中一些单元格显示超出范围。 这些资源将帮助您修复它(您必须创建UICollectionViewFlowLayout的子类并覆盖此方法):
- (NSArray *)layoutAttributesForElementsInRect:(CGRect)rect {
NSArray *attributes = [super layoutAttributesForElementsInRect:rect];
NSMutableArray *newAttributes = [NSMutableArray arrayWithCapacity:attributes.count];
for (UICollectionViewLayoutAttributes *attribute in attributes) {
if ((attribute.representedElementCategory != UICollectionElementCategoryCell) || // always include everything that's not a cell
((attribute.frame.origin.x + attribute.frame.size.width <= (self.collectionViewContentSize.width - self.sectionInset.right)) &&
(attribute.frame.origin.y + attribute.frame.size.height <= (self.collectionViewContentSize.height - self.sectionInset.bottom))))
{
[newAttributes addObject:attribute];
}
}
return newAttributes;
}
此修复的基础来源:
答案 1 :(得分:1)
直到有人知道最新情况以及这是否是一个错误,我目前使用的解决方法是:
- (NSArray *)alterAttributes:(NSArray *)attributes
{
for (UICollectionViewLayoutAttributes *attribute in attributes) {
switch (attribute.indexPath.item % 3) {
case 0:
attribute.center = CGPointMake(CellX1,attribute.center.y);
break;
case 1:
attribute.center = CGPointMake(CellX2,attribute.center.y);
break;
case 2:
attribute.center = CGPointMake(CellX3,attribute.center.y);
break;
default:
break;
}
}
return attributes;
}
手动更改layoutAttributesForElementsInRect
中的x坐标 - 并非真正令人满意的解决方案。