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在该索引路径中没有项目时才返回。您在调用之前可能没有调用reloadData您的集合视图layoutAttributesForItemAtIndexPath:吗?

另一个常见问题是调用链中的一些中间对象是nil. 也许 collectionView 或 collectionView.collectionViewLayout 是nil

于 2013-11-09T12:36:16.897 回答