之间有什么区别
collectionViewController.collectionViewLayout.collectionViewContentSize()
和collectionViewController.collectionView.contentSize
?
您更喜欢使用什么?
答案 0 :(得分:5)
contentSize
是UIScrollView
的属性,而collectionViewContentSize()
是UICollectionViewLayout
的方法。
阅读Programming iOS 7, 4th Edition,在总结UICollectionViewLayout
的同时,作者声明:
集合视图的布局workhorse类。集合视图 没有布局实例就不能存在!正如我已经说过的那样 布局知道所有子视图占用多少空间, 提供 collectionViewContentSize,用于设置集合的contentSize 查看,选择滚动视图。
根据个人经验,我在使用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
将自动调用内容大小将被更新。
答案 1 :(得分:-2)
collectionViewContentSize()
是一种可以覆盖(在布局中)动态生成大小的方法。
contentSize
是collectionView
的属性,如果没有此类覆盖,将使用该属性。
类似于UITableView
的{{1}}与rowHeight
的{{1}}。
另请注意(正如评论中所述)“UITableViewDelegate
是heightForRowAtIndexPath()
- 继承的属性,contentSize
是UIScrollView
上允许您使用的属性为每个单元格指定一个毯子大小“。