问题
我有一个带有单个UICollectionView的应用程序,第一次滚动它时会出现断断续续的情况.我已经将源代码缩小到创建新单元格(2)的事实(使用initWithFrame :)因为没有单元格可以重复使用.在初始滚动之后,重用队列不为空,并且可以重复使用单元格,并且没有卡顿.
哈克
所以我已经能够在iOS runtime headers的私有方法的帮助下解决问题:
- (void)_reuseCell:(id)arg1;
我的假设是,这是将单元格添加回重用队列的位置.使用这个未记录的方法的黑客看起来像这样:
int prefillCellCount = 10; NSMutableArray *cells = [[NSMutableArray alloc] initWithCapacity:prefillCellCount]; for (int i=0; i<10prefillCellCount i++) { UICollectionViewCell *cell = [self.gridView dequeueReusableCellWithReuseIdentifier:@"cell" forIndexPath:[NSIndexPath indexPathForRow:i inSection:0]]; [cells addObject:cell]; } for (UICollectionViewCell *cell in cells) { [self.gridView _reuseCell:cell]; }
黑客工作!滚动时没有口吃.
问题
我不认为我能够通过这个黑客攻击App Store评论员.有没有办法在不使用未记录的方法的情况下做到这一点?如果没有,我唯一的办法就是混淆黑客攻击?
解决方法
Is there a way to do this without the use of undocumented methods?
如果问题只是创建单元格需要很长时间,那么您只需创建一些附加内容并在视图控制器中保留它们,直到集合请求它们为止.在你的代码中预先分配一些单元格,调用dequeueReusableCellWithReuseIdentifier:获取集合为你创建它们.将它们保存在视图控制器中的数组中.接下来,在您的… cellForItemAtIndexPath:方法中,如果数组不为空,则从数组中删除一个单元格并使用它而不是向集合视图询问可重用单元格.
这应该通过移动创建单元格的点而不使用任何未记录的方法来解决您的问题.
另一种方法是加速细胞创建过程,这样您就不必费心预先分配细胞.描述您的代码,看看为什么您的细胞需要很长时间才能构建.也许您可以通过删除不必要的视图来简化您的单元结构