0

所以我有一个使用自定义布局的 UICollectionView。我使用 prepareLayout 来设置属性,但现在我的数据集已经增长并从数据库中提取信息并且可能有数百万个项目 - 显然我无法存储这么多的属性(它实际上由于内存而崩溃问题)。

我已经搜索了 SO 和 Apple Docs 以获取像我这样使用自定义布局的示例,但它们都预加载了布局信息。如果有人可以帮助我如何实施以下方法,我将不胜感激 -

-(void)prepareLayout // does this actually need to do anything in my case?
-(NSArray *)layoutAttributesForElementsInRect:(CGRect)rect // how do I calculate this on the fly?

感谢您的任何指示。

4

1 回答 1

0

这对你们大多数人来说可能很明显,但我花了一点时间才弄明白。

如果你不覆盖它,prepareLayout 什么都不做——在我的例子中,因为我不想预加载 1000 个单元格的所有布局信息,所以我不会覆盖它。

我的 layoutAttributesForElementsInRect: 实现在这里-

-(NSArray *)layoutAttributesForElementsInRect:(CGRect)rect
{
    NSMutableArray *allAttributes = [NSMutableArray array];

    NSInteger startItem = MAX(0, (NSInteger)(rect.origin.y / self.cellHeight) * kDaysInWeek);    
    NSInteger endItem = MIN(kNumDaysInCalendar, startItem + (NSInteger)((rect.size.height / self.cellHeight + 1)) * kDaysInWeek);

    for (int i = startItem; i < endItem; i++)
    {
        NSIndexPath *indexPath = [NSIndexPath indexPathForItem:i inSection:0];
        UICollectionViewLayoutAttributes *layoutAttributes = [UICollectionViewLayoutAttributes layoutAttributesForCellWithIndexPath:indexPath];
        layoutAttributes.frame = [self frameForCellAtIndexPath:indexPath];

        [allAttributes addObject:layoutAttributes];
    }

    return allAttributes;
}

我意识到每个新屏幕满时都会调用此方法,传递的矩形是可见内容上的窗口,所以我需要做的就是返回该矩形中每个项目的属性数组 - 我有另一种方法 frameForCellAtIndexPath: 计算给定 indexPath 处的单元格的框架。

现在它完美地工作,没有占用内存的预加载。

于 2013-05-30T15:54:46.430 回答