OSのユーザーインターフェースを作る時はさけて通れないCollectionView。 TableViewより柔軟なレイアウトがくめる分、深く考えずに実装をすすめてしまうと、コードが煩雑になったり、パフォーマンスが悪くなったり、予想通りの効果をだすことができないことも……。 ここでは、複数のレイアウトを柔軟に適用する技術、また高いFPSを持ち、メンテナンス性の高いCollectionView/TableViewを作るための秘策をお教えします。
iOS10時代のCollectionView最新つかいこなし
見た目は変わらないのでチェックしていない人もおられるかもしれないが、変わっている。
今までのライフサイクル
1万行のTableでCellが1万あるわけではない。
メモリを消費せずにどうやってなめらかにスクロールするか。
行毎に、必要に応じて都度生成
さらにスクロールした時に必要に応じて新しく作り
要らなくなったものは再利用します。
CollectionViewで下から新しいCellを作るときに複数作らなくてはならないのがパフォーマンス上の問題になった。
先読みすることになってCellの生成に時間がかかってもスクロールの滑らかさに影響しない。
WillDisplayが呼ばれる感覚が長く
iOS9でもスムーズなスクロールを実現するために心がけることが出来るのは?
重い処理をCellForItemAtIndexPathで行う方が良い
↑これは私が実際にやってみて一番効果が大きかったです。
透過PNGを置いたり、透明なもの、CALayerを使った影やCornerRadiusを使った角丸など。何処で自分がやっているか分からなければシミュレータで調べることが出来る。
赤い部分を減らして緑になるように描画処理を軽くすればパフォーマンスが良くなります。
透過PNGや背景透明のラベルを使いたい時、背景を同じ色で塗りつぶしてしまうのが良い。
まとめ
Q&A
PreFetchはデリゲートなので、iOS9の人が使っても呼ばれないだけでiOS10ではパフォーマンスが上がることになるのでしょうか
はい、そうなります
画像の先読みなどに使う想定ですか
内部計算をしてから情報を表示するような場合など。計算型プロパティに対して先に計算を走らせるなど。
1.5倍先のCellを先読みすることでパフォーマンスが良くなるというのがよくわからなかった
先読みすることで先に処理をしておくことが出来る。セルの生成が1.5倍先に先読みを開始してから実際に表示されるまで、処理が終わっていなければスクロールのパフォーマンスは良くならない。
感想
— イルカ@新米プログラマー (@ikkitang) August 20, 2016twitter.com
twitter.comメモリ使用量は増えるけどパフォーマンスは良くなる #iosdc #a
— りばーす (@rb_de0) August 20, 2016
twitter.comtry! Swiftか、AppleTV Tech Talkでも聞いたなー。
— Kohei Tabata (@nerd0geek1) August 20, 2016
Blend-Layer処理を見つけ出して、パフォーマンス改善する話。#iosdc #a
twitter.com#iosdc #a prefetchやiOS9以前でのパフォーマンス改善の話の詳細はWWDC Videoでも。(関係ないけどこれ漫才みたいで面白い) What's New in UICollectionView in iOS 10 https://t.co/1HlUnsqwpe
— takasek (@takasek) August 20, 2016
まとめ
twitter.com「iOS10で変更されたCollectionViewのライフサイクルを見てみよう! #a #iosdc」をトゥギャりました。 https://t.co/3udPw94xSu
— トゥギャッター開発まとめ (@tg__dev) August 20, 2016