我有一个UICollectionView
使用自定义单元格子类化UICollectionViewCell
。在代码中我做了以下事情:
[self.collectionView_ registerClass:[AHPinterestCell class]
forCellWithReuseIdentifier:@"AHPinterestCell"];
这就是我的cellForItem
AHPinterestCell *cell =
(AHPinterestCell *)[collectionView dequeueReusableCellWithReuseIdentifier:@"AHPinterestCell"
forIndexPath:indexPath];
然而,它似乎并没有重复使用该单元。在我的每个屏幕的集合视图中,它显示大约 9-10 个单元格,但是当我无限滚动然后调用insertItemsAtIndexPath
它称为initWithFrame
我的自定义单元格上的方法,而它可能应该重用我已有的单元格。为什么是这样?
EDIT:
我正在添加一个示例演示项目来说明问题,可以找到 xcode 项目的链接here。当您到达底部时,它本质上是在进行无限滚动,它只是向其中添加更多内容。但是当你这样做时,它将再次调用 init 方法。
简而言之,您的代码运行良好。正如预期的那样,当单元格滚出屏幕时,它们最终会被标记为可供重用。当你打电话时dequeueReusableCellWithReuseIdentifier
,如果有一个单元格可供重用,它将这样做。如果没有,它就会创建一个。
当您快速或连续滚动时,您会看到大量单元格被创建。但是,如果您进行短暂的小滚动,放开,暂停,让 UI 跟上并重复,那么您将看到创建的单元格非常少。
我将此解释为 iOS 优先考虑 UI 和新单元格的创建,而不是旧单元格的出队,从而允许它们重用。因此,如果您快速翻转,它就很难追上并将旧单元标记为可重复使用。这可能并不完全是坏事,因为这可能是集合视图如此流畅的原因。标记旧单元以供重用是 iOS 在这里要做的不太重要的事情之一。但显然,如果内存紧张,这可能是一个问题。
顺便说一句,如果你放一个NSLog
in dealloc
你也会注意到,当用户界面在集合视图中进行快速滚动后最终赶上时,它显然有一些逻辑说“哎呀,我的备用单元格比我真正需要的多,我是将摆脱其中一些。”实际上,这是一个非常聪明的实现。注重速度,但一旦 UI 安静下来就会进行一些内存优化。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)