0

我有一个带有自定义 UICollectionViewCell 的 UICollectionView。每个单元格内部都有一个 UITextView。问题: UICollectionView 非常慢,在模拟器中也是如此。

-(void)viewDidLoad
{
[self.collectionView registerClass:[AgendaCollectionCell class]
         forCellWithReuseIdentifier:agendaCellIdentifier];
}
-(UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath {


 AgendaCollectionCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:agendaCellIdentifier forIndexPath:indexPath];

cell.delegate = self;
cell.layer.shouldRasterize = YES;
cell.layer.rasterizationScale = [UIScreen mainScreen].scale;
[cell setCurrentDateAtIndex:([indexPath row]) date:currentMonth events:events];


// Return the cell
return cell;

}

我检查了探查器

在此处输入图像描述

每个单元格都会进行与日期相关的计算。如您所见,loadNibNamed 加载时间过长。UITextView 也需要太多。我在这里搜索了很多问题并使用了他们的一些答案。(我还缓存了 NSCalendar 的所有实例)。我不明白为什么加载大约需要 435 毫秒。UICollectionView 有 40 个单元格(它包含一个月中的天数)。我应该放弃使用 UICollectionView 并使用 drawRect 转换为自定义视图吗?

编辑 我认为答案中建议的一点是:使用 UNib 而不是 registerClass 加载单元格。我可以看到一个非常大的性能提升:从 400 毫秒到仅 98 毫秒!

4

1 回答 1

1

试着放

UINib * nib = [UINib nibWithNibName:@"YourNibName" bundle:[NSBundle mainBundle]];
[self.collectionView registerNib:nib forCellWithReuseIdentifier:@"MyCell"];

进入你的viewDidLoad,然后永远不要自己创建单元格(在

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForIndexPath:(NSIndexPath *)indexPath;

实现总是调用

UICollectionViewCell * cell = [collectionView dequeueCell...]

这样,我认为,collection view只会加载一次笔尖(在您的viewDidLoad方法中,然后在需要时创建它的副本。

于 2013-09-13T21:22:30.687 回答