collectionViewContentSize()vs contentSize

时间:2014-08-15 19:55:55

标签: ios swift uicollectionview uicollectionviewcell uicollectionviewlayout

之间有什么区别

collectionViewController.collectionViewLayout.collectionViewContentSize()collectionViewController.collectionView.contentSize

您更喜欢使用什么?

2 个答案:

答案 0 :(得分:5)

contentSizeUIScrollView的属性,而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()是一种可以覆盖(在布局中)动态生成大小的方法。

contentSizecollectionView的属性,如果没有此类覆盖,将使用该属性。

类似于UITableView的{​​{1}}与rowHeight的{​​{1}}。

另请注意(正如评论中所述)“UITableViewDelegateheightForRowAtIndexPath() - 继承的属性,contentSizeUIScrollView上允许您使用的属性为每个单元格指定一个毯子大小“。