Представление «Коллекция», с пользовательскими макетами, при неправильной прокрутке ячейки

Я пытаюсь создать пользовательский плиточный макет, используя UICollectionView. Он отлично воспроизводится в симуляторе, когда я запускаю свое приложение.

Но в тот момент, когда я прокручиваю вид и возвращаю его обратно, все изменения кадра ячейки и ячейки перекрываются, оставляя пробелы случайным образом.

Я не могу решить эту проблему последние 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 ячеек, когда я прокручиваю, он никогда не отрисовывает правильно Даже при перезагрузке коллекции, ячейки искажаются. Пожалуйста помоги.

Ответы на вопрос(2)

Ваш ответ на вопрос