5

UICollectionViewのセルのサイズに少し苦労しています。Androidでは、セルのサイズを簡単に「ラップ」できます。iOSの場合と同様に、「GetCell」という関数呼び出しがあり、その大きさを決定します。

iOSとの違いは、(UICollectionViewControllerの) "getCell"関数では、セル(またはcontentview)のサイズを選択できないように見えることです。サイズを変更すると、それは無視され、とにかくCollectionViewの一般的な「ItemSize」が使用されます(これはすべてのセルで同じです)。

これにより、ビューがあまり美しくない場合があります。たとえば、画像を含む水平方向のリストがある場合、一方の画像が200x200で、もう一方の画像が400x200の場合、画像間の距離を同じにします。したがって、セルサイズも異なる必要があります。

セルごとに異なるサイズを定義することができます。CollectionviewデリゲートとGetSizeForItem(= ObjCではsizeForItemAtIndexPath)関数を使用できます。問題は、この関数が実際のGetCell関数の前に呼び出されることです。

したがって、たとえばいくつかのラベルを含む、より複雑なセルがある場合。「GetCell」関数でこのセルを作成し、最後にセルを返すときに、どのサイズにする必要があるかを確認します。ただし、GetSizeForItem関数では、セルがまだ「null」であるため、その情報はまだ利用できません。

私がそれを行うことができる唯一の方法は、「GetSizeForItem」呼び出しの瞬間にセルのUIViewを実際に構築することです(サイズを要求できるように)。しかし、これは良い設計ではないようです。これは、UIViewを「GetCell」の前に構築していて、そこで再度構築するためです。

見落としているものはありますか?

よろしく、マット

4

1 に答える 1

10

実際、GetSizeForItemはGetCellとは別に呼び出されます。UIViewの作成は非常に時間とメモリを消費するタスクであり、アプリケーションがメモリを使い果たすか、大きなリストを処理できるように他のビューを破棄する必要があるため、このように行われます。

ビューが表示される前に、UICollectionView(およびUITableView)は、リスト内のすべて(またはほとんど)の要素のサイズと位置を要求するため、それらを描画する場所を知ることができます。ただし、これらの要素の多くは表示されないため、collectionViewで要素を作成する必要はありません。これが、GetSizeForItemが事前に呼び出され、GetCellが後で呼び出される理由です。

あなたの場合、ビューのサイズを計算するロジックをビュー自体から分離してみてください。ビューが存在する必要のない単純な数式にして、事前に実行するのに十分な速度を実現します。

于 2012-11-25T21:44:39.043 に答える