セルにUITableView
多くの画像を表示する がありますが、スクロールのパフォーマンスに満足していません。MyUITableView
は iPhone の写真アプリのようなものです。iPhoneの写真アプリが画面に何もないかのように非常に速くスクロールする理由を誰か知っていますか.
そして、誰かが私のパフォーマンス/スクロール速度を上げるためのヒント/コツを持っていますか?
セルにUITableView
多くの画像を表示する がありますが、スクロールのパフォーマンスに満足していません。MyUITableView
は iPhone の写真アプリのようなものです。iPhoneの写真アプリが画面に何もないかのように非常に速くスクロールする理由を誰か知っていますか.
そして、誰かが私のパフォーマンス/スクロール速度を上げるためのヒント/コツを持っていますか?
画像を事前にキャッシュし、怠惰にしないでください。テーブルをスクロールすると、UITableViewDataSource:cellForRowAtIndexPath:メソッドが呼び出され、そこに画像を読み込んでいると、セルの内容をスクロールとして要求し、アプリケーションにレイテンシが発生するのがわかります。cellForRowAtIndexPathを次のように作成してみてください。
NSDate *date = [NSDate date];
... your cell loading code ...
NSLog( @"Elapsed time to generate cell %.2d", [date timeIntervalSinceNow] );
各セルを取得するために費やしている時間が表示されます。
これを回避するには、必要なだけ複雑にすることができます。画像がたくさんある場合は、ますます賢くする必要があります。ページ読み込みを実行できます。ここでは、最後に要求されたセルのNSIndexPathを追跡し、スクロールが上下しているかどうかを判断して、+ NSImage:imageNamedを使用します。一度に1ページ分の画像を前方に(つまり、現在の位置から5画像前方に)フェッチするか、またはうまくいくものをフェッチします(人々がスワイプするためにテーブルの下部に指を戻さなければならないという事実を利用します)繰り返しになりますが、テーブル要素の消費には一時停止があります。ページサイズをスワイプで埋めるのに十分な大きさにすることができます)。ただし、これはおそらくまだ素晴らしいことではありません。すべてのセルに負荷がかかるのではなく、一度にすべての影響を受けるだけだからです。
制御をUIにすばやく戻し、NSRunLoop:performSelector:target:argument:order:mode:を使用してメインの実行ループからNSImage:imageNamed:を使用して、プリフェッチされた画像のページをスケジュールできるようにします。十分に先にフェッチしているので、表示できるようになります。
しかし、あなたは記憶の懸念を痛感する必要があります。これが問題であることがわかった場合は、NSImage:initWithContentsOfFile:を使用してください。これにより、メモリが少ない状況で画像キャッシュがクリーンアップされます。キャッシュ無効化アルゴリズムで使用される戦略によっては、これらの状況により、キャッシュをパージし、無効化されたプリフェッチをリロードする必要があるため、「スタッター」が発生する可能性があります。
UITableViewCell をサブクラス化し、各セルの内容を直接描画することにより、優れたスクロール パフォーマンスの結果が報告されています。詳細とコード サンプルへのリンクについては、この質問に対する受け入れられた回答を参照してください。
ここでの問題はメモリです。一度にロードする高解像度の写真が多すぎます。写真アプリはテーブルビューを使用せず、スクロール ビューを使用し、一度に最大 3 つの写真しかロードしないため、メモリは問題ではありません。写真アプリと同様のことをしようとしている場合は、スクロールビューを使用してください