私は、3つのUICollectionViews
を含むスタックビューを持っています。そのスタックビューはディスプレイの半分の高さに設定されているため、より大きなデバイスでより多くのスペースを使用します。これはInterface Builderで設定されています。実行時にUICollectionViewCellSizeを設定する
私たちが実行するまでは、実際のセルのサイズはわからないので、実行時にUICollectionView
のセルサイズを設定する必要があります。私はそれらを正方形にしたいので、ちょうどUICollectionView
の高さを考慮して、上部と下部のインセットを減算して、結果のサイズにitemSize
を設定します。
viewDidLayoutSubviews
でこれを実行しようとしています。コレクションビューの最初の高さが設定されていることがわかります。しかし、それらは1000x1000に設定されているように見えます(ストーリーボードではもっと合理的なサイズですが)ので、コレクションビューの高さ1000に基づいてセルサイズを計算します。これは大きすぎますが、私はもう一度呼び出され、もう一度それを再計算するチャンスがあります。 UICollectionView
がitemSize
が正しくないことを大声で文句を言う前に、私はやるではなく、(今「正しい」のサイズを持っているcollectionView
、中に収まるには大きすぎる。すなわち。)
動作Iを取得するための最良の方法は何ですかUICollectionView
からの警告なしで探していますか? UICollectionView
の最終的なサイズに基づいて、実行時にコレクションビューアイテムのサイズを設定することは、私が過去に苦労していたものであり、itemSize
を設定するための「正しい」時間ではないようです。プログラムの寿命中に変化するものではないからといって、それを動的に返すのは嫌です。最初にビューをレイアウトするときに発生する矛盾があるようです。
コレクションビューには1000.0で1000.0の初期サイズが付属していますが、それをどうやって修正するのかはわかりません。おそらくスタックビューに埋め込まれていることと関係しています?
編集の追加:ほとんどの場合、レイアウトの問題を引き起こすのはUIStackView
です。私は、UIStackView
に埋め込まれたトップレベルビューのときにUICollectionView
のサイズをテストするためのダミープロジェクトを作成しました。埋め込まれていない場合、viewDidLayoutSubviews
が呼び出されると、superview
の境界に合うように適切なサイズになりました。ただし、UIStackView
の内部にある場合、デフォルトサイズは1000x1000のままです。
今のところ、私はviewDidLayoutSubviews
に次のコードを追加することでこの問題を回避働いています:
collectionView
は
UIStackView
と
view
内にある
if collectionView.bounds.size.width > view.bounds.size.width { view.layoutIfNeeded() }
はUIViewController
のメインビューです。これにより、後でビューのサイズに基づいた計算がすべて正しく行われ、UIStackView
の動作が修正された場合にはうまくいきません。
同様の説明hereとhere。興味深いことに、XCode8では、新しいデフォルトではXIBファイルのビューサイズが保存されず、最初のレイアウトパスで解決されるように初期サイズ1000x1000のものがすべて含まれています。 UIStackView
を除いて、私は推測する。