这对你们大多数人来说可能很明显,但我花了一点时间才弄明白。
如果你不覆盖它,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 处的单元格的框架。
现在它完美地工作,没有占用内存的预加载。