忍者ブログ

佐崎司と愉快な仲間達

ゲーム、アニメ、CG、iOS開発など思いついたことを記事にしています。 管理人が3人いますので、記事にまとまりはないと思います。 iPhoneアプリのレビュー依頼も受け付けています。

UITableViewのスクロールを滑らかにする8の方法

わか
iOSのUITableviewスクロールに関して、滑らかに動かす際に効果があった
ことについて記載します

スクロールすると1行毎(セル)に以下のメソッドが呼ばれます。
tableView:cellForRowAtIndexPath
このメソッド内の処理が10ミリ秒以下になるとスクロールが滑らかになります。
cellForRowAtIndexPath内で以下の処理に気をつける事でスクロールが改善される場合があります。

・セルを再利用する
1行毎にセルを生成する処理は時間がかかりますので、一度生成したセルは再利用します。
再利用できるセルを取り出す dequeueReusableCellWithIdentifier
再利用セルを生成する reuseIdentifier

・NSUserDefault使用しない
設定値など呼び出す場合に使用しますが、ファイル読み出しになりますので遅いです。
値が必要な場合は、事前にNSArrayにでも読み込んでおいて使用するのがいいです。

・initWithContentOfFile使用しない
これもファイル読み出しになりますので、遅いです。事前に読み込んでおきましょう
画像ファイルの場合、UIImage:imageNamed:を使用すると劇的に読み込みが早いです。
しかしimageNamedは一度読み込んだファイルはキャッシュされ続けます。そのため
メモリリークになってしまうおそれがあります。使用する場合は、何回も読み込むファイル
(フォルダ画像など)に限ります。

・performSelectorInBackground使用しない
非同期処理を実行する際にperformSelectorInBackgroundを使用しますが、
このメソッドは何故か実行が遅いです。
非同期処理を実行する際にはdispatch_queue_tを使用した方が早いです。

・alphaは1.0
セル内の部品(UILabelやUIImageなど)は半透明にしません。
半透明にすると、オフスクリーンレンダリングという処理が発生します。
オフスクリーンレンダリングとは、実際にセルが表示される際に発生する
レンダリング処理で、これがかなり遅いです。
ですので、alphaは1.0(0.0)全く透明にしないか、完全に透明のどちらかにします。

・layerを使用しない
layerを使用することで、UILabelやUIImage等をを角丸にしたり影を
つけることができます。
しかしこの処理もオフスクリーンレンダリングが発生するため、遅いです。
角丸や影などの画像処理したい場合は、予めそのように加工した画像を用意しましょう。

・セルの縦幅を広げる
縦幅が広いと、スクロールする際のセルの切り替わりが遅くなります。
そのため高速スクロールした際に、若干効果があります。

・UILabelの文字列描画
文字列もオフスクリーンレンダリングが発生します。
短い文字列なら問題ありませんが、文字列が増えると遅くなります。
setNumberOfLinesやsetLineBreakModeを使用して出来るだけ短くしましょう。

あと、遅くなる原因の一つとしてフォントがあります。
スクロール中に現在設定されているフォントに含まれない文字列(韓国語とか)
が存在すると、遅くなります。一度表示されるとキャッシュされるのか早くなりますが
UITableViewを再読み込みして表示するとやはり遅いです。
これに関しては解決策が分からず放置中です。
誰か知っている方がおられれば、教えて頂きたいですね・・・。

拍手[0回]

PR