0

私のセットアップ: フロー レイアウトの標準 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);"

ここで何が起こっているのですか?コンテンツのサイズにアクセスすると、レイアウトで何かがトリガーされると思いますが、これを行う適切な方法があるかどうかは誰にもわかりませんか? それとも、これは単なる迷惑なバグですか?

4

1 に答える 1

0

のドキュメントには、そのインデックス パスにアイテムがない場合にlayoutAttributesForItemAtIndexPath:のみ返されると記載されています。を呼び出す前に、コレクション ビューを呼び出さなかったのnilでしょうか。reloadDatalayoutAttributesForItemAtIndexPath:

もう 1 つの一般的な問題は、呼び出しチェーンの中間オブジェクトがnil. おそらく、collectionView または collectionView.collectionViewLayout はnil?

于 2013-11-09T12:36:16.897 に答える