在UICollectionView上调用reloadData后,不会更新contentSize

时间:2013-09-30 20:35:04

标签: ios uicollectionview

有人知道为什么在UICollectionView上调用reloadData后不会立即更新contentSize吗?

如果您需要了解contentSize,我发现的最佳工作如下:

[_collectionView reloadData];

double delayInSeconds = 0.0001;
dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delayInSeconds * NSEC_PER_SEC));
dispatch_after(DISPATCH_TIME_NOW, dispatch_get_main_queue(), ^(void)
    {
        // TODO: Whatever it is you want to do now that you know the contentSize.
    });

显然,这是一个相当脆弱的黑客,它对苹果公司的实施进行了假设,但到目前为止,它已被证明非常可靠。

有没有人有任何其他解决方法或知道为什么会发生这种情况?我正在辩论提交雷达,因为我无法理解为什么他们无法在同一个运行循环中计算contentSize。这就是UITableView为其整个实现工作的方式。

编辑:此问题用于引用块内的setContentOffset方法,因为我想在我的应用程序中滚动集合视图。我删除了方法调用,因为人们的回答集中在为什么我没有使用scrollToItemAtIndexPath来解释为什么没有更新contentSize。

6 个答案:

答案 0 :(得分:73)

要在重新加载后获取内容大小,请尝试调用布局对象的collectionViewContentSize。这个对我有用。

答案 1 :(得分:13)

这对我有用:

[self.collectionView.collectionViewLayout invalidateLayout];
[self.collectionView.collectionViewLayout prepareLayout];

答案 2 :(得分:7)

编辑:我刚刚对此进行了测试,实际上,当数据发生变化时,我的原始解决方案将会崩溃并显示以下内容:

“无效更新:第0部分中的项目数无效。更新后现有部分中包含的项目数(7)必须等于更新前该部分中包含的项目数(100),再加上或减去从该部分插入或删除的项目数量(0已插入,0已删除)以及加或减移入或移出该部分的项目数量(0移入,0移出)。“

处理此问题的正确方法是在数据源发生更改时计算插入,删除和移动,并在数据源发生变化时使用performBatchUpdates。例如,如果将两个项添加到作为数据源的数组的末尾,则这将是代码:

NSArray *indexPaths = @[indexPath1, indexPath2];
[self.collectionView performBatchUpdates:^() 
{
    [self.collectionView insertItemsAtIndexPaths:indexPaths];
} completion:^(BOOL finished) {
    // TODO: Whatever it is you want to do now that you know the contentSize.
}];

以下是Kernix提供的原始答案的编辑解决方案,我认为不能保证其有效。

在UICollectionView上尝试performBatchUpdates:completion :.您应该可以访问完成块中的更新属性。它看起来像这样:

[self.collectionView reloadData];
[self.collectionView performBatchUpdates:^() 
{

} completion:^(BOOL finished) {
    // TODO: Whatever it is you want to do now that you know the contentSize.
}];

答案 3 :(得分:0)

调用后

[self.collectionView reloadData];

使用这个:

[self.collectionView setNeedsLayout];
[self.collectionView layoutIfNeeded];

然后你就可以得到真正的contentSize

答案 4 :(得分:-2)

首先调用prepareLayout,然后您将获得正确的contentSize:

[self.collectionView.collectionViewLayout prepareLayout];

答案 5 :(得分:-2)

就我而言,我有一个自定义布局类,该类继承了UICollectionViewFlowLayout并仅在Interface Builder中进行设置。我不小心从项目中删除了该类,但Xcode没有给我任何错误,并且集合视图的contentSize始终返回零。

我放回课程,它又开始工作了。