【发布时间】:2013-09-30 20:35:03
【问题描述】:
有谁知道为什么在 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.
});
显然,这是一个相当脆弱的 hack,它对 Apple 的实现做出假设,但到目前为止,它已被证明非常可靠。
是否有人对为什么会发生这种情况有任何其他解决方法或知识?我正在辩论提交雷达,因为我不明白为什么他们不能在同一个运行循环中计算 contentSize。这就是 UITableView 在其整个实现中的工作方式。
编辑:这个问题用于引用块内的 setContentOffset 方法,因为我想在我的应用程序中滚动集合视图。我删除了方法调用,因为人们的答案集中在为什么我没有在 contentSize 没有更新的原因中使用 scrollToItemAtIndexPath。
【问题讨论】:
-
我认为更合适的方法是使用 scrollToItemAtIndexPath:atScrollPosition:animated:。至于为什么不更新内容大小,我只能假设它是一种优化,以防止调用潜在的大量且昂贵的动态大小计算或返回不准确的信息,进而进行不必要的处理和工作。
-
在实际的应用程序中我确实使用了它。为简单起见,我选择提及 setContentOffset。这是一个很好的观点,即多次调用 reloadData 可能会触发昂贵的计算。太糟糕了,没有带有完成处理程序方法的 reloadData。
-
在访问
UICollectionView之前致电layoutIfNeededcontentSize
标签: ios uicollectionview