UITableViewを滑らかにスクロールさせるための方法が色々なところで公開されていますので、確認するべきポイントをまとめて列挙します。
基本的には、tableView: cellForRowAtIndexPath
内での重い処理を避けるというのが大前提になります。
セルを生成するために毎回呼ばれるメソッドの中での処理を軽くしてやることで、滑らかなスクロールを実現します。
この手のポイントは数多く存在するので、主立った一部を紹介します。
透過ビューを使わない
透過画像を生成するのは重い処理なので避ける。
半透明にすると、オフスクリーンレンダリングという重たい処理が発生してしまう。
これはUILabelの文字列に対しても発生する。
対策
- 必要のない部分では、
alpha
を1.0または0にする - 背景色をベースカラーと合わせて投下させないようにする
- UILabelの範囲を必要最小限に留める
現在どれくらい使われているかは、Simulator -> Debug -> Color Blended Layers
にチェックを入れることで、シュミレータから視覚的に確認することができる。
使われている部分は赤く表示されるので、その部分を減らすようにする。
layerの効果を使わない
UILabelやUIImageでlayerを利用することで角を丸めたりなどの効果を付けることが出来るが、
これもオフスクリーンレンダリングが発生する重い処理なので避ける。
あらかじめ丸く加工した画像を用意しておくなどして、対処する。
表示する画像のサイズと実際の画像のサイズを統一する
実際に必要な画像のサイズよりも大きなものをセットしようとすると、メモリを多く消費してしまう可能性がある。
予めリサイズしてからセットする、そもそもサイズが統一されたものを用意しておくなどする。
通信は非同期で行う
tableViewの中で、同期的に画像を読み込むと重くなる。
SDWebImageなどを利用して、非同期読み込みを行う。
ファイル読み出しを使用しない
NSUserDefaultなどのファイル読み出しは遅くなるので避ける。
中身をあらかじめ取り出しておいて値を利用する。
セルを再利用する
セルを生成する処理は時間がかかってしまうので、一度生成したセルを再利用するようにする。
dequeueReusableCellWithIdentifier
を利用して、再利用可能なセルを取り出す。
セルの高さをキャッシュする
セルの高さが変わらない場合は、高さを決定するheightForRowAtIndexPath
での計算を毎回やらずに、計算結果をキャッシュするようにする。
参考
http://qiita.com/yimajo/items/a796739be4496f7aa3dd
http://qiita.com/noppefoxwolf/items/3109857f60e25816e55d
http://labs.gree.jp/blog/2013/12/9669/
http://tech.pero.li/entry/2016/07/01/193000
http://mokyu.game-ss.com/it%E9%96%A2%E9%80%A3/uitableview%E3%81%AE%E3%82%B9%E3%82%AF%E3%83%AD%E3%83%BC%E3%83%AB%E3%82%92%E6%BB%91%E3%82%89%E3%81%8B%E3%81%AB%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95
http://blog.yoneapp.com/entry/2016/01/12/174947
まとめ
tableViewの滑らかさはアプリケーションの使い心地に直結するので頑張ってチューニングしましょう。
また見つけ次第追記します。