我有一个UICollectionView,带有自定义UICollectionViewCell。 每个单元格里面都有一个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。我可以看到一个非常大的性能提升:从400ms到98ms!
答案 0 :(得分: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
方法中,然后在需要时创建它的副本。