覆盖UICollectionView / PSTCollectionView的layoutAttributesForElementsInRect:导致可见单元格重新加载

时间:2013-07-29 06:34:51

标签: iphone ios uicollectionview sony pstcollectionview

我想模仿iPhone应用程序中索尼Xperia提供的图库应用程序的功能。我是gallary应用程序,图像以按日期分组的网格显示,并且该部分的第一张照片的尺寸是其他照片的两倍。在挤出/放入时,所有照片都会缩小/缩小。

enter image description here

我按照Lithu T.V的建议使用了PSTCollectionView并创建了一个自定义布局。在那个布局中,我覆盖了- (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 个答案:

答案 0 :(得分:1)

使用UICollectionView 如果app应该支持小于5.0,请使用PSTCollectionView

A nice startup