问题
我有一个只有一个UICollectionView的应用程序,我第一次滚动它的时候就口吃了。我缩小了源的范围,因为创建了新的单元格(2) (使用initWithFrame:),因为周围没有可以重用的单元格。在该初始滚动之后,重用队列不为空,单元格可以重用,也不会结结巴巴。
The Hack
所以我已经能够用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的评论通过这次黑客攻击。有没有办法做到这一点,而不使用无文档化的方法?如果不是的话,我唯一的办法就是混淆黑客的存在吗?
发布于 2014-02-19 10:50:44
有没有办法做到这一点,而不使用无文档化的方法?
如果问题仅仅是创建单元格需要很长时间,那么您可以简单地创建一些额外的部分,并将它们保存在视图控制器中,直到集合请求它们为止。正如在代码中所做的那样,预先分配几个单元格,调用dequeueReusableCellWithReuseIdentifier:来获取集合,以便为您创建它们。将它们保存在视图控制器中的数组中。接下来,在...cellForItemAtIndexPath:方法中,如果数组不是空的,则从数组中删除一个单元格并使用它,而不是向集合视图请求一个可重用的单元格。
这应该通过移动创建单元格的点来解决您的问题,而不需要使用任何无文档的方法。
另一种方法是加快单元格的创建过程,这样就不必费心预先分配单元格了。分析您的代码,以了解为什么您的单元格要花这么长时间来构建。也许您可以通过删除不必要的视图来简化您的单元格结构?
https://stackoverflow.com/questions/21877873
复制相似问题