gpt4 book ai didi

ios - Collection View ,具有自定义布局,单元格在滚动时行为不端

转载 作者:行者123 更新时间:2023-12-01 19:10:27 24 4
gpt4 key购买 nike

我正在尝试使用 UICollectionView 创建自定义平铺布局。
一旦我运行我的应用程序,它就会在模拟器中完美呈现。

但是当我 ScrollView 并将其恢复时,所有单元格的框架都发生了变化,单元格重叠,随机留下空间。

过去 2 天我无法解决此问题。
这是我的自定义布局类中的代码。

-(void)prepareLayout{
[self createCellSizeArray];//cellSizeArray holds cell sizes for all the cells(calculated statically)
[self createAttributeArrayOfAll];//attributeArrayOfAll holds attributes for all the cells and also calculates their frames using cellSizeArray
}

-(CGSize)collectionViewContentSize{
return CGSizeMake(768, 1500);//The size is static to check for scrolling, is this creating problems?
}

-(UICollectionViewLayoutAttributes *)layoutAttributesForItemAtIndexPath:(NSIndexPath *)indexPath{
UICollectionViewLayoutAttributes * layoutAttributes = [UICollectionViewLayoutAttributes layoutAttributesForCellWithIndexPath:indexPath];
return layoutAttributes;
}

-(NSArray *)layoutAttributesForElementsInRect:(CGRect)rect{
NSMutableArray *attArray =[NSMutableArray array];
for (NSInteger i =0; i< attributeArrayOfAll.count; i++) {
UICollectionViewLayoutAttributes * attribute = (UICollectionViewLayoutAttributes*)[attributeArrayOfAll objectAtIndex:i];
if(CGRectIntersectsRect(rect, attribute.frame)){
[attArray addObject:attribute];
}
}
return attArray;
}

-(BOOL)shouldInvalidateLayoutForBoundsChange:(CGRect)newBounds{
return YES;
}

请帮助,在此先感谢。

编辑 :
在我的 [self createAttributeArrayOfAll];我有这些代码行
CGRect frame = CGRectMake(_startNewRowPoint.x, _startNewRowPoint.y, cellSize.width, cellSize.height);
UICollectionViewLayoutAttributes * attribute = [UICollectionViewLayoutAttributes layoutAttributesForCellWithIndexPath:[NSIndexPath indexPathForItem:i inSection:0]];
attribute.alpha = 1.0;
attribute.frame = frame;
[attributeArrayOfAll addObject:attribute];

虽然我修改了 layoutAttributesForItemAtIndexPath: , 看起来像这样
-(UICollectionViewLayoutAttributes *)layoutAttributesForItemAtIndexPath:(NSIndexPath *)indexPath{
UICollectionViewLayoutAttributes * layoutAttributes = [UICollectionViewLayoutAttributes layoutAttributesForCellWithIndexPath:indexPath];
layoutAttributes.frame = ((UICollectionViewLayoutAttributes*)[attributeArrayOfAll objectAtIndex:indexPath.item]).frame;
return layoutAttributes;
}

此外,方法 layoutAttributesForItemAtIndexPath:永远不会被隐式调用。我什至试过这个:
-(NSArray *)layoutAttributesForElementsInRect:(CGRect)rect{
NSMutableArray *attArray =[NSMutableArray arrayWithCapacity:attributeArrayOfAll.count];
for (NSInteger i =0; i< attributeArrayOfAll.count; i++) {
UICollectionViewLayoutAttributes * attribute = (UICollectionViewLayoutAttributes*)[attributeArrayOfAll objectAtIndex:i];
if(CGRectIntersectsRect(rect, attribute.frame)){
[attArray insertObject:[self layoutAttributesForItemAtIndexPath:[NSIndexPath indexPathForItem:i inSection:0]] atIndex:i];
}
}
return attArray;
}

但结果仍然是滚动时相同的扭曲单元格集。
我使用了 5 个单元格,第一次正确渲染时,在滚动时将其带回可见矩形,它会变形,如果我再次滚动并带回可见矩形,它会正确渲染。但是,当我使用大约 400 个单元格执行此操作时,一旦我滚动它就永远不会正确呈现。即使在重新加载 Collection View 时,单元格也会变形。请帮忙。

最佳答案

您的 layoutAttributesForItemAtIndexPath:方法未设置 layoutAttributes 的任何属性返回之前的对象。需要设置frame (或 centersize )。

关于ios - Collection View ,具有自定义布局,单元格在滚动时行为不端,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16898584/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com