iOS
UITableView
UIKit
Swift

UITableViewを滑らかにスクロールさせるための確認すべきポイントまとめ

More than 1 year has passed since last update.

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の滑らかさはアプリケーションの使い心地に直結するので頑張ってチューニングしましょう。

また見つけ次第追記します。