我在xib中有定制的UICollectionViewCell。
当加载ViewController时,单元格子类中的awakeFromNib()被调用6次(屏幕最初放置了6个单元格,好),但当我开始滚动时,awakeFromNib()会被调用6倍以上,从而导致延迟。但是在这之后,“重新加载”滚动开始顺利地工作。这只是在滚动开始的第一次发生。显然,使用的是dequeueReusableCell。
使用UITableView来代替集合,情况类似。感觉就像接下来的6个单元再次从xib加载(仅在100+单元的集合中),忽略了重用。
有什么问题吗?
为清楚起见:
UIColectionView具有垂直滚动方向,两个单元格在线上。当ViewController加载时,我看到屏幕上有6个单元格,控制台中有6个awakeFromNib调用。
我开始向下滚动到7-8个单元,在它们出现在屏幕上之前,我看到了滞后和两个awakeFromNib方法调用。
类似地,对于以下两对单元格。
在此滚动开始后,工作良好,直到单元格99-100+,而awakeFromNib从未被调用。
补充道: OK,下面是我发现的:
我在一个subView中有一个collectionView (标题类似于UITableView),因此,collectionViewLayout设置了sectionInsets top = header的高度。如果我删除标题,并使顶部嵌入,例如:-180 (大约排除NavigationBar的高度,所以屏幕最初适合12个单元格,滚动滞后消失。
Ie,系统需要从xib加载所有在屏幕上一次可见的单元格,并在将来重用它们。(但为什么不一次加载xib并立即对所有其他初始单元进行重用呢?)
现在的问题是-如何解决它?
Added.2
工作解决方案-在viewDidAppear方法ViewController中添加标头,但是.嗯..。不太好。
发布于 2017-03-24 11:10:42
这实际上是一个已知的副作用(或有目的的设计?)UICollectionView & UITableView。这里有一个相关的问题(谈论NSTableView,但概念/问题是相同的):
awakeFromNib method called multiple times
您的集合视图最初显示六个单元格,但听起来iOS需要再分配六个单元格,以便向左和向右滚动。因此,内存中至少有12个(可重用)单元。
如果您在awakeFromNib中做了大量的工作(这是导致延迟的原因),您可能想要确定如何优化事情。
您还可以在这个相关问题中找到其他一些有用的提示:
https://stackoverflow.com/questions/42996256
复制相似问题