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

  显示原文与译文双语对照的内容
0 0

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

如果需要知道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.
    });

显然这是一个相当脆弱的黑客工具,会做一些假设Apple上实现,但到目前为止它已被证明相当可靠地工作。

有人还有其他解决办法或知识上为什么出现这种情况? 我争论提交雷达因为这个我不理解为什么不能计算contentSize在相同的运行循环。 这就是UITableView惟一为其整个实现。

编辑: 这个问题用于引用setContentOffset方法块因为我想滚动集合视图在我的app中的。 我删除了方法调用因为人民'答案关注我怎么不知使用scrollToItemAtIndexPath里面为什么contentSize没有被更新。

时间:原作者:6个回答

0 0

要获取其内容大小重新加载后,尝试调用 collectionViewContentSize布局的对象。 挺适合我的。

原作者:
0 0

编辑: 我刚刚测试了这一更确切地说是在数据更改时,我的原始解决方案就崩溃,包括以下内容:

" 无效的更新: 无效的条目数量第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提供的编辑,我觉得一定可以工作。

试试performBatchUpdates:completion: 在UICollectionView 。 你应该可以访问到更新完成块中的属性。 它就会变成这样:

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

首先调用prepareLayout,才会得到正确contentSize :

[self.collectionView.collectionViewLayout prepareLayout];
原作者:
0 0

这对我很管用:

[self.collectionView.collectionViewLayout invalidateLayout];
[self.collectionView.collectionViewLayout prepareLayout];
原作者:
...