私には、ページングなどを備えた共通のUICollectionViewがあります。
それでも、viewDidLoad:、viewWillAppear :、およびviewDidAppear:で理由を理解しようとしていますが、最初のビューの呼び出しでのみ、myCollectionView.collectionView.contentSize.widthを呼び出すと誤ったサイズが取得されます。常に幅0で応答します(高さは常に正しいです)。ビューを連続して再読み込みすると、正しいビューが表示されます。
使用に訴えた
self.collectionView.collectionViewLayout.collectionViewContentSize
これにより、最初のロード時に正しい幅イベントが得られます。
まだ私には謎です。
したがって、contentSizeの幅が常に0である同様の問題が発生しました。簡単な答えは...おそらくcollectionViewにはまだコンテンツがありません。そのため、コンテンツのサイズはゼロです。
また、UICollectionViewでinvalidateLayout
を呼び出した後、self.collectionView.collectionViewLayout.collectionViewContentSize
がself.collectionView.contentSize
と同じではないことに気づきました。
多くの検索の結果、素晴らしいヒントが見つかりました ここのSO投稿
両方のcontentSize計算を同じにするために必要なことは、[self.collectionView layoutIfNeeded]
または[self.collectionView reloadData]
を呼び出した直後に[self.collectionView.collectionViewLayout invalidateLayout]
を呼び出すことでした。
これは基本的に、次の実行ループサイクルではなく、ただちにリロードを強制的に実行します。
これで問題が解決することを願っています。
上記の答えは正しいですが、UICollectionViewController
をプログラムまたは_xib/storyboard
_で追加する場合は、UICollectionViewFlowLayout()
のscrollDirection
に注意する必要がありますUICollectionViewController
。 horizontal
であり、コンテンツheight
を追跡したい場合、適切な結果が得られない可能性が非常に高くなります。
私の場合、以下のコードを使用しました。
_self.someCollectionViewController?.collectionView.reloadData()
self.someCollectionViewController?.collectionView.layoutIfNeeded()
if let height = self.someCollectionViewController?.collectionViewLayout.collectionViewContentSize.height {
self.someProductCollectionViewHeightConstraints?.constant = height
}
_