web-dev-qa-db-ja.com

最初のロード時にUICollectionViewのcontentSizeが間違っている、その後修正

私には、ページングなどを備えた共通のUICollectionViewがあります。

それでも、viewDidLoad:、viewWillAppear :、およびviewDidAppear:で理由を理解しようとしていますが、最初のビューの呼び出しでのみ、myCollectionView.collectionView.contentSize.widthを呼び出すと誤ったサイズが取得されます。常に幅0で応答します(高さは常に正しいです)。ビューを連続して再読み込みすると、正しいビューが表示されます。

使用に訴えた

self.collectionView.collectionViewLayout.collectionViewContentSize

これにより、最初のロード時に正しい幅イベントが得られます。

まだ私には謎です。

25
klauslanza

したがって、contentSizeの幅が常に0である同様の問題が発生しました。簡単な答えは...おそらくcollectionViewにはまだコンテンツがありません。そのため、コンテンツのサイズはゼロです。

また、UICollectionViewでinvalidateLayoutを呼び出した後、self.collectionView.collectionViewLayout.collectionViewContentSizeself.collectionView.contentSizeと同じではないことに気づきました。

多くの検索の結果、素晴らしいヒントが見つかりました ここのSO投稿

両方のcontentSize計算を同じにするために必要なことは、[self.collectionView layoutIfNeeded]または[self.collectionView reloadData]を呼び出した直後に[self.collectionView.collectionViewLayout invalidateLayout]を呼び出すことでした。

これは基本的に、次の実行ループサイクルではなく、ただちにリロードを強制的に実行します。

これで問題が解決することを願っています。

55
ucangetit

上記の答えは正しいですが、UICollectionViewControllerをプログラムまたは_xib/storyboard_で追加する場合は、UICollectionViewFlowLayout()scrollDirectionに注意する必要がありますUICollectionViewControllerhorizontalであり、コンテンツheightを追跡したい場合、適切な結果が得られない可能性が非常に高くなります。

私の場合、以下のコードを使用しました。

_self.someCollectionViewController?.collectionView.reloadData()
self.someCollectionViewController?.collectionView.layoutIfNeeded()
if let height = self.someCollectionViewController?.collectionViewLayout.collectionViewContentSize.height {

   self.someProductCollectionViewHeightConstraints?.constant = height
}
_
0