3

私が直面している問題は、一連の画像を縦に並べて追加し、全体をスクロール可能にすることです。画像は 768x768 です。これには UITableView を使用しています。

最初に、次の方法で単一のセルをデキューするだけでそれを実行しようとしました:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

私のデバイスは、そのような画像の垂直方向に 1.5 しか収まらないため、新しい画像が読み込まれるたびに遅延が発生しました。

だから...アプリケーションのロード時に配列内のすべてのセルをキャッシュすることで、単純にテストすると思いました。したがって、セルを取得するための私の方法は次のようになります。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{
    PhotoItemCellController *cell = [imgs objectAtIndex:[indexPath row]];
    return cell;
}

ここに奇妙なことがあります:これはすべて、必要に応じて画像を動的にロードするのと同じです-同じラグがあります...しかし...テーブル全体を最後までスクロールすると、テーブルが機能し始めます完璧に (明らかに何らかのキャッシュが発生します)。

  • なぜこれが起こるのですか?
  • テーブルからセルを「デキュー」するのではなく、セルの配列を使用しているためでしょうか?
  • セルに UIImageView が含まれているためでしょうか? たぶん、最初に表示されたときに何かをします。

また、テーブルをスクロールするときにのみ RAM 使用量の急増に気付きます。アプリの起動時にすべてのセルをメモリ内の画像と共に読み込むと、実質的に消費はありません。

任意の考えをいただければ幸いです

4

2 に答える 2

1

UIImage は、遅延読み込みが可能なある種のインテリジェント キャッシュに支えられています。イメージ ファイルは、必要になるまでメモリに読み込まれない可能性が非常に高いです。画像の OpenGL テクスチャを作成するときにも少し遅延があります (UIKit はレンダリングに OpenGL を使用するため、これをバックグラウンドで行います)。スムーズなスクロールだけが必要な場合は、フォアグラウンドでスピナーを表示し、UITableView の背後に 1 つずつ表示する一連の UIImageViews を作成できます (セルを生成するために UIImageViews を保持します)。そうすれば、ユーザーがスクロールを開始する前に、すべてのデータがキャッシュされ、(できれば) テクスチャの OpenGL コンテキストに保存されます。

于 2013-06-19T22:37:13.363 に答える