#iosdc 2016 A-3 iOS10時代のCollectionView最新つかいこなし

twitter.com

OSのユーザーインターフェースを作る時はさけて通れないCollectionView。 TableViewより柔軟なレイアウトがくめる分、深く考えずに実装をすすめてしまうと、コードが煩雑になったり、パフォーマンスが悪くなったり、予想通りの効果をだすことができないことも……。 ここでは、複数のレイアウトを柔軟に適用する技術、また高いFPSを持ち、メンテナンス性の高いCollectionView/TableViewを作るための秘策をお教えします。

iosdc.jp

speakerdeck.com

iOS10時代のCollectionView最新つかいこなし

f:id:niwatako:20160820114121j:plain

f:id:niwatako:20160820114127j:plain

f:id:niwatako:20160820114131j:plain

f:id:niwatako:20160820114137j:plain

見た目は変わらないのでチェックしていない人もおられるかもしれないが、変わっている。

今までのライフサイクル

f:id:niwatako:20160820114202j:plain

1万行のTableでCellが1万あるわけではない。

f:id:niwatako:20160820114218j:plain

メモリを消費せずにどうやってなめらかにスクロールするか。

行毎に、必要に応じて都度生成

f:id:niwatako:20160820114250j:plain

f:id:niwatako:20160820114310j:plain

さらにスクロールした時に必要に応じて新しく作り

f:id:niwatako:20160820114323j:plain

要らなくなったものは再利用します。

f:id:niwatako:20160820114338j:plain

CollectionViewで下から新しいCellを作るときに複数作らなくてはならないのがパフォーマンス上の問題になった。

f:id:niwatako:20160820114450j:plain

f:id:niwatako:20160820114445j:plain

f:id:niwatako:20160820114458j:plain

先読みすることになってCellの生成に時間がかかってもスクロールの滑らかさに影響しない。

f:id:niwatako:20160820114553j:plain

WillDisplayが呼ばれる感覚が長く

f:id:niwatako:20160820114556j:plain

f:id:niwatako:20160820114604j:plain

f:id:niwatako:20160820114646j:plain

f:id:niwatako:20160820114656j:plain

f:id:niwatako:20160820114707j:plain

f:id:niwatako:20160820114714j:plain

f:id:niwatako:20160820114726j:plain

f:id:niwatako:20160820114733j:plain

f:id:niwatako:20160820114739j:plain

iOS9でもスムーズなスクロールを実現するために心がけることが出来るのは?

f:id:niwatako:20160820114746j:plain

f:id:niwatako:20160820114811j:plain

f:id:niwatako:20160820114822j:plain

重い処理をCellForItemAtIndexPathで行う方が良い

f:id:niwatako:20160820114848j:plain

↑これは私が実際にやってみて一番効果が大きかったです。

透過PNGを置いたり、透明なもの、CALayerを使った影やCornerRadiusを使った角丸など。何処で自分がやっているか分からなければシミュレータで調べることが出来る。

f:id:niwatako:20160820114945j:plain

赤い部分を減らして緑になるように描画処理を軽くすればパフォーマンスが良くなります。

透過PNGや背景透明のラベルを使いたい時、背景を同じ色で塗りつぶしてしまうのが良い。

f:id:niwatako:20160820115121j:plain

f:id:niwatako:20160820115124j:plain

f:id:niwatako:20160820115203j:plain

まとめ

f:id:niwatako:20160820115208j:plain

Q&A

PreFetchはデリゲートなので、iOS9の人が使っても呼ばれないだけでiOS10ではパフォーマンスが上がることになるのでしょうか

はい、そうなります

画像の先読みなどに使う想定ですか

内部計算をしてから情報を表示するような場合など。計算型プロパティに対して先に計算を走らせるなど。

1.5倍先のCellを先読みすることでパフォーマンスが良くなるというのがよくわからなかった

先読みすることで先に処理をしておくことが出来る。セルの生成が1.5倍先に先読みを開始してから実際に表示されるまで、処理が終わっていなければスクロールのパフォーマンスは良くならない。

感想

twitter.com

twitter.com

twitter.com

twitter.com

まとめ

twitter.com