Переопределение layoutAttributesForElementsInRect: of UICollectionView / PSTCollectionView приводит к перезагрузке видимой ячейки

Я хочу имитировать функции приложения галереи, представленные в Sony Xperia в приложении для iPhone. В моем приложении изображения отображаются в виде сетки, сгруппированной по дате, а первая фотография раздела в два раза больше остальных. При уменьшении / уменьшении все фотографии уменьшаются / уменьшаются.

Я использовал PSTCollectionView в соответствии с предложением Lithu TV и создал собственный макет. В этом макете я переопределил - (NSArray *)layoutAttributesForElementsInRect:(CGRect)rect, Сильфон это код для того же.

// called continuously as the rect changes
 - (NSArray *)layoutAttributesForElementsInRect:(CGRect)rect {
 NSArray *attribs = [super layoutAttributesForElementsInRect:rect];

 NSMutableArray *arrmFrames=nil;
 for (int i=0;i<attribs.count;i++) {

     UICollectionViewLayoutAttributes *attributesInitial=[attribs objectAtIndex:0];

     UICollectionViewLayoutAttributes *attributes=[attribs objectAtIndex:i];

     //Take initial frame from first cell
     if(i==0)
    fFirstCellsY = attributes.frame.origin.y;

     //while Y is constant, save the adjusted frames for next cells
     else if(attributes.frame.origin.y<fFirstCellsY+attributesInitial.frame.size.height)
     {
      if(arrmFrames==nil)
          arrmFrames=[[NSMutableArray alloc]init];

         attributes.frame=CGRectMake(attributes.frame.origin.x, attributesInitial.frame.origin.y, attributes.frame.size.width, attributes.frame.size.height);
         [arrmFrames addObject:NSStringFromCGRect(CGRectMake(attributes.frame.origin.x, attributes.frame.origin.y+attributes.frame.size.height+10, attributes.frame.size.width, attributes.frame.size.height))];
     }

     //Adjust the frame of other cells
     else
     {
         CGRect frame = attributes.frame;
         attributes.frame=CGRectFromString((NSString*)[arrmFrames objectAtIndex:0]);
         [arrmFrames removeObjectAtIndex:0];
         [arrmFrames addObject:NSStringFromCGRect(frame)];
     }

 }

 }

return attribs;
}

Это работает, и макет выглядит так, как я хотел. При использовании этого метода становится больше ячеек, чем при использовании макета по умолчанию, и мой макет выглядит хорошо. но когда я прокручиваю вниз, некоторые видимые ячейки перезагружаются. Я думаю, что причина в методе делегата - (PSUICollectionViewCell *)collectionView:(PSUICollectionView *)cv cellForItemAtIndexPath:(NSIndexPath *)indexPath вызывается раньше - (NSArray *)layoutAttributesForElementsInRect:(CGRect)rect что есть в моем пользовательском макете. и поэтому ячейки, которые не были видны в макете по умолчанию, но видны в пользовательском макете, перезагружаются поздно.

Как я могу преодолеть это?

1 ответ

Решение

Использовать UICollectionView Если приложение должно поддерживать менее 5.0, используйте PSTCollectionView

Хороший стартап

Другие вопросы по тегам