web-dev-qa-db-ja.com

iPhone UITableViewのスクロールパフォーマンスを向上させるための秘?

各セルにかなり大きな画像を読み込むuitableviewがあり、セルの高さは画像のサイズによって異なります。スクロールのパフォーマンスはまともですが、時々ぎくしゃくすることがあります。

FieryRobotブログで見つけた以下のヒントを見つけました。

glassy-scrolling-with-uitableview

more-glassy-scrolling-with-uitableview

UitableViewのスクロールパフォーマンスを改善するためのヒントはありますか?

89
Jonah
  1. 行の高さをキャッシュします(Table Viewはこれを頻繁に要求できます)
  2. テーブルで使用されている画像に対して最も最近使用されていないキャッシュを作成します(メモリ警告が表示されたら、すべての非アクティブなエントリを無効にします)
  3. UITableViewCelldrawRect:にすべてを描画します。可能な限りサブビューを避けます(または、標準のアクセシビリティ機能が必要な場合は、コンテンツビューのdrawRect:
  4. UITableViewCellのレイヤーを不透明にします(コンテンツビューがある場合は同じです)
  5. UITableViewの例/ドキュメントで推奨されているように、reusableCellIdentifier機能を使用します
  6. UIImagesにプリベイクされていないグラデーション/複雑なグラフィック効果を避ける
154
rpetrich
  1. UITableViewCellをサブクラス化する場合は、ペン先を使用せず、代わりにコードで記述してください。 Nibファイルをロードするよりもはるかに高速です。
  2. 画像を使用している場合は、それらをキャッシュしていることを確認してください。これにより、ファイルごとに複数回ロードする必要がなくなります(メモリがある場合は、画像が占めるスペースの大きさに驚くでしょう)。
  3. できるだけ多くの要素を不透明にします。同様に、透明ではない画像を使用してみてください。
40
Shaggy Frog

Tweetieの背後にいる開発者は、これについて広範囲にわたって書いており、そのアプリでどのように行われたかを示すコードをいくつか持っています。基本的に、彼/彼女はテーブルセルごとに1つのカスタムビューを提唱し、手動で描画します(他のオプションの中でもInterface Builderでサブビューするのではなく)。

itableviewでトゥイーティーで高速スクロール

また、Appleは、TableViewSuiteチュートリアルでTableView用の独自のサンプルコードを更新しました(これに対する応答でしょうか?)

TableViewSuite

34
beno

UITableViewスクロールの#1パフォーマンスキラーは、任意のセルビューレイヤーに影を描画するため、スクロールのパフォーマンスが重要な場合、基本的にメインスレッドの速度が低下しない限り、シャドウを実行しないでください。

受け入れられた答えのどれも影とレイヤーについて言及していないので、これは言わなければならなかったと思いました。 :+)

1
believesInSanta

UITableViewスクロールパフォーマンスの問題は、他の回答で既に説明した手法を使用して解決できます。ただし、パフォーマンスの低下は多くの場合、本質的にエラーまたは反復的なものが原因です。

UITableViewがセルを再利用するという事実と、各セルが独自のイメージを必要とする可能性があるという事実により、ソリューションが少し複雑になります。一般的な方法でどのように解決されているかから、ここで注意すべきことを要約します。

  1. データソースへのデータのロード-from REST/database。このステップはバックグラウンドで実行する必要があり、最終的にdispatch_asyncとGCDキューを使用します。
  2. 関連するデータモデルオブジェクトを作成して初期化し、配列内に配置する
  3. [tableView reloaddata]
  4. cellForRowAtIndexPath内に、配列の正しいデータモデルオブジェクトからデータ(テキスト)を設定するコードを含めます。
  5. 現在、画像もURLの形式になっている可能性があります。そのため、Table Viewでセルを再利用するため、このステップは少し風変わりです。事実の核心は、非同期キューを使用してデバイスキャッシュ/ URLからイメージをもう一度ロードし、それをcell.image(セルイメージプロパティ)を修正するように設定することです。

問題を回避するには、テーブルビュー内の イメージの遅延読み込み に関するこのチュートリアルを参照してください。

0
Nirav Bhatt