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

有谁知道为什么在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. }); 

显然,这是一个相当脆弱的黑客,对苹果公司的实施做出了假设,但到目前为止,它已被certificate工作相当可靠。

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

编辑:这个问题用来引用块内的setContentOffset方法,因为我想滚动我的应用程序中的集合视图。 我已经删除了方法调用,因为人们的答案集中在为什么我不使用scrollToItemAtIndexPath为什么contentSize没有被更新。

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

这对我工作:

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

编辑:我刚刚testing了这一点,事实上,当数据改变时,我的原始解决scheme将崩溃​​与以下内容:

“更新无效:部分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提供的我原来的答案的编辑解决scheme,我不认为是保证工作。

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

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

先调用prepareLayout,然后你会得到正确的contentSize:

 [self.collectionView.collectionViewLayout prepareLayout];