私のセットアップ: フロー レイアウトの標準 UICollectionView。データソースはコントローラーに設定されています。レイアウトは xib ファイルで通常どおりに構成されます。コントローラの viewDidLoad メソッドで layoutAttributesForItemAtIndexPath: を介してセルのレイアウト属性にアクセスしようとすると、次のようになります。
NSLog(@"LayoutAttribute: %@", [self.collectionView.collectionViewLayout layoutAttributesForItemAtIndexPath: [NSIndexPath indexPathForRow:0 inSection:0]]);
出力は
"LayoutAttribute: (null)"
レイアウトには、正しいレイアウト属性を提供するために必要なすべての情報が含まれています。viewWillAppear: ではまだ機能しませんが、viewDidAppear: では「魔法のように」機能し始めます。
"LayoutAttribute: <UICollectionViewLayoutAttributes: 0x8c4f710> index path: (<NSIndexPath 0x8c48be0> 2 indexes [0, 0]); frame = (0 0; 50 50);"
それを機能させるための非常に奇妙な方法を発見しました。レイアウト属性を要求する前に、collectionViewContentSize にアクセスするだけです。
NSLog(@"Layout content size: %@", NSStringFromCGSize(self.collectionView.collectionViewLayout.collectionViewContentSize));
NSLog(@"LayoutAttribute: %@", [self.collectionView.collectionViewLayout layoutAttributesForItemAtIndexPath: [NSIndexPath indexPathForRow:0 inSection:0]]);
出力は、ずっと予想どおりです。
"Layout content size: {768, 50}"
"LayoutAttribute: <UICollectionViewLayoutAttributes: 0x8c4f710> index path: (<NSIndexPath 0x8c48be0> 2 indexes [0, 0]); frame = (0 0; 50 50);"
ここで何が起こっているのですか?コンテンツのサイズにアクセスすると、レイアウトで何かがトリガーされると思いますが、これを行う適切な方法があるかどうかは誰にもわかりませんか? それとも、これは単なる迷惑なバグですか?