【发布时间】:2014-01-14 13:12:13
【问题描述】:
如何正确调整 UICollectionView 的大小以使其完全显示其内容?我尝试了很多东西,包括设置它的框架、调用reloadData 和使布局无效:
self.collectionView.contentSize = CGSizeMake(300, 2000);
self.collectionView.frame = CGRectMake(0, 0, 300, 2000);
[self.collectionView reloadData];
[self.collectionView.collectionViewLayout invalidateLayout];
但是这些都没有任何效果。按下按钮后,我仍然看到初始视图,如下所示:
我有一个小型演示程序,其中有一个生成 100 个元素的数据源。在 Interface Builder 中,我最初将 UICollectionView 的大小设置为一个较小的值,以便并非所有元素都适合,然后我按下一个按钮,然后执行上面的代码。我希望 UICollectionView 现在可以显示所有元素,但事实并非如此。
编辑:演示程序可以在https://github.com/mjdemilliano/TestUICollectionView找到。
EDIT2: 我观察到帧更新在某些时候会丢失,因为如果我再次按下按钮,当前帧会恢复到旧值。在按钮事件处理程序中添加一些日志语句后,日志输出为:
before: frame = {{0, 58}, {320, 331}}, contentSize = {320, 1190}
update button pressed
after: frame = {{0, 0}, {300, 2000}}, contentSize = {300, 2000}
before: frame = {{0, 58}, {320, 331}}, contentSize = {320, 1190}
update button pressed
after: frame = {{0, 0}, {300, 2000}}, contentSize = {300, 2000}
我不明白为什么不保留框架变化,是什么在改变它。
在某些时候,我会将硬编码的值替换为从流布局中获得的值,但我想排除这种情况并让我的示例尽可能简单。
上下文:我最终想要做的是:我有一个带有各种控件(如标签和图像)的可滚动视图,以及一个带有动态内容的集合视图。我想滚动所有这些,而不仅仅是集合视图,因此我没有使用集合视图自己的滚动工具,它工作正常。
【问题讨论】:
-
当你说你的代码没有效果时——你的意思是字面意思吗?设置
contentSize是设置可滚动区域的正确方法。如果你不能滚动,那么你就没有设置contentSize。您确定self.collectionView在您拨打电话时不是nil吗?也许你不小心在viewDidLoad之前打电话? -
@Tommy:我添加了一个指向完整测试项目的链接。代码在 viewDidLoad 之后运行,因为它在按下按钮时运行。按下按钮时没有任何反应,但日志语句确认值已更新。然而,我认为更改集合视图的
contentSize或frame没有任何效果。请注意,我已禁用集合视图本身的滚动,因为我希望集合视图本身完整显示,然后在此工作后将其包装在滚动视图中。 -
Martijn,你能给我一个你的测试项目的更新链接吗?指定的 github 链接不起作用,我想做一些非常像你在这里描述的事情。
-
@JohnMichaelZorko 哎呀......两周前我刚刚从 Github 上删除了它,当时我是在自发的清洁狂热中,不知道我从这个问题中提到了它。对不起!我已经从我认为是这个测试项目的本地克隆中重新创建了它,希望它可以帮助你!
-
发布了类似问题的答案:stackoverflow.com/a/67055114/855680
标签: ios objective-c uicollectionview nslayoutconstraint