collectionViewController.collectionViewLayout.collectionViewContentSize()和collectionViewController.collectionView.contentSize之间有什么区别?
你更喜欢使用哪一个?
collectionViewController.collectionViewLayout.collectionViewContentSize()和collectionViewController.collectionView.contentSize之间有什么区别?
你更喜欢使用哪一个?
contentSize
是UIScrollView
的一个属性,而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()
不仅返回内容大小,还会启动布局计算。如果在这些计算过程中检测到异常情况,则会输出警告信息。viewDidLayoutSubviews
开始的初始尝试处理小视图。检查集合视图的框架发现它太小了。后续的布局引擎传递最终提供了正确的尺寸,但是此时警告已经显示出来了。invalidateLayout()
,但我不确定应该在哪里调用。我尝试在实例化集合视图之后调用,但没有成功。viewDidLayoutSubviews
的初始尝试中,仍然显示错误的尺寸,但最终会变好。它不会生成任何控制台警告,更好的是,不会触发基于旧框架大小的任何错误布局。更好的是,旋转会自动处理,因为viewDidLayoutSubviews
将被自动调用,此时内容大小已经更新。collectionViewContentSize()
是一个你可以重写的方法(在布局中),以动态生成大小。
contentSize
是collectionView
(或任何UIScrollView
)的属性,如果没有这样的重写,它将被使用。
这类似于UITableView
的rowHeight
与UITableViewDelegate
的heightForRowAtIndexPath()
之间的关系。
请注意(如评论中所述),"contentSize
是一个UIScrollView
继承的属性,而itemSize
是UICollectionViewLayout
上的属性,允许您为每个单元格指定一个统一的大小"。
contentSize
是从UIScrollView继承而来的,因此API表示它是“内容视图的大小”。这意味着它应该是每个单元格的总体内容,而不仅仅是特定单元格的统一contentSize
,这正如您的类比所指示的那样。我说得对吗? - JánoscollectionViewContentSize
应该被UICollectionViewLayout
的所有子类继承,并且不应该被表述为“你可以重写”。 - Jonathan Wang