広告UICollectionViewを理解するには、cellForItemAtとsizeForItemAtがどの順番で実行されるかを把握しないといけない。selfview.addSubview(collectionView)とする。その後、データをどこからか取得して、セルに入れていく。お決まりの「reloadData」を行う。多くの参考書にあるように、UICollectionViewを扱うときはreloadDataを必ず実行しなければいけない。これらの手順は次のようにまとめられる。セルを描画するデータをセルに入れるセルを再描画するもう少し詳しく流れをおさえるどこかのウェブサイトから検索したアイテムを表示するようなプログラムを想定する。ヘッダーセルは検索結果に関係なく、固定されている。通常セルは検索結果にあるそれぞれのアイテムを表す。今、ヘッダーセルを3個、通常セルを7個用意する。このとき、次の順番でプログラムが実行される。10ポイントはsizeForItemAtのあとにcellForItemAtがくること。このポイントをわかっているかわかっていないかで、セルの高さを調節するという最もポピュラーで最も難しい難所をほんの少しだけ解決できる。reloadData前は、プログラムはセルは用意するものの、そこにどんなデータが入ってくるかわからない。1000行もあるテキストかもしれないし、画像かもしれない。セルだけは準備しないといけないので、幅や高さはズボラに設定してもあまり問題ない。カスタムセルの内部で高さを設定していれば、その高さがこの時点で反映される。reloadData後が問題である。reloadDataすると、いよいよセルにデータが入ってきて、画面が一気に更新される。挙動不審なセルの高さ2番目のセルにUITextViewが入っているとしよう。中身が変われば高さが変わるという厄介なviewである。これはあるカスタムセルに入っているとする。height)呼び出しもとでは、そのviewに入ってきた文章量に応じて高さを変えている。上のコードはスタックオーバーフローなどでよく知られている有名なコードだ。boundingRectを使うことがポイントになる。boundingRectを使って、中身のテキスト量に依存する高さを取得する。reloadDataする前はデータが入っていないため、高さは0に近い(実際は0でない。この辺りの原因もよくわからない)。reloadDataするとデータが入ってきて、上のコードが動的な高さを計算し、セルの高さを自動的に変えてくれる。boundingRectは、テキストが多かったり少なかったりすると高さが合わないという問題がある。reloadDataして高さを自動的に変えるというプログラムは、いまだに多くの開発者を苦しめているようだ。スタックオーバーフローやYouTubeの解説動画を含めて、情報が非常に少ない。この辺りは開発者が知識を積極的に発信するしかない。