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 を使用してカスタム ビューにキャストする必要がありますか?

編集 良い点は、答えで示唆されていることだと思います.registerClassではなくUNibを使用してセルをロードします。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 に答える