collectionViewContentSize()与contentSize的区别

5

collectionViewController.collectionViewLayout.collectionViewContentSize()和collectionViewController.collectionView.contentSize之间有什么区别?

你更喜欢使用哪一个?

2个回答

6

contentSizeUIScrollView的一个属性,而collectionViewContentSize()UICollectionViewLayout的一个方法。

在阅读《Programming iOS 7, 4th Edition》时,作者在总结UICollectionViewLayout时指出:

这是集合视图的布局核心类。没有布局实例,就没有集合视图!正如我已经说过的那样,布局知道所有子视图占用的空间大小,并提供设置集合视图内容大小(即滚动视图的内容大小)的collectionViewContentSize

根据个人经验,在使用layout.collectionViewContentSize()时可能会遇到以下警告或初始布局不正确的情况。

the behavior of the UICollectionViewFlowLayout is not defined because: the item height must be less than the height of the UICollectionView minus the section insets top and bottom values.

我猜测collectionViewContentSize()不仅返回内容大小,还会启动布局计算。如果在这些计算过程中检测到异常情况,则会输出警告信息。

在iPad上进行测试并通过Xib启动集合视图时,Xib的框架大小与iPhone相同。从viewDidLayoutSubviews开始的初始尝试处理小视图。检查集合视图的框架发现它太小了。后续的布局引擎传递最终提供了正确的尺寸,但是此时警告已经显示出来了。

接下来,我尝试将Xib框架调大。这消除了错误,但导致了更严重的问题:布局最初是错误的。在滚动时,您会看到项目跳来跳去,因为重新计算了布局以获得正确的尺寸。

可能的解决方法是调用invalidateLayout(),但我不确定应该在哪里调用。我尝试在实例化集合视图之后调用,但没有成功。

所以答案是什么呢?我使用了contentSize。在viewDidLayoutSubviews的初始尝试中,仍然显示错误的尺寸,但最终会变好。它不会生成任何控制台警告,更好的是,不会触发基于旧框架大小的任何错误布局。更好的是,旋转会自动处理,因为viewDidLayoutSubviews将被自动调用,此时内容大小已经更新。

-2

collectionViewContentSize()是一个你可以重写的方法(在布局中),以动态生成大小。

contentSizecollectionView(或任何UIScrollView)的属性,如果没有这样的重写,它将被使用。

这类似于UITableViewrowHeightUITableViewDelegateheightForRowAtIndexPath()之间的关系。

请注意(如评论中所述),"contentSize是一个UIScrollView继承的属性,而itemSizeUICollectionViewLayout上的属性,允许您为每个单元格指定一个统一的大小"。


1
collectionView中的contentSize是从UIScrollView继承而来的,因此API表示它是“内容视图的大小”。这意味着它应该是每个单元格的总体内容,而不仅仅是特定单元格的统一contentSize,这正如您的类比所指示的那样。我说得对吗? - János
你把contentSize和itemSize搞混了。contentSize是UIScrollView继承的属性,而itemSize是UICollectionViewLayout上的属性,它允许你为每个单元格指定一个统一的大小。 - silver_belt
collectionViewContentSize 应该被 UICollectionViewLayout 的所有子类继承,并且不应该被表述为“你可以重写”。 - Jonathan Wang

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接