collectionViewContentSize()与contentSize

有什么区别

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

你喜欢用什么?

collectionViewContentSize()是一个可以覆盖(在布局中)dynamic生成大小的方法。

contentSizecollectionView一个属性,如果没有这样的覆盖,它将被使用。

它类似于UITableViewrowHeightUITableViewDelegateheightForRowAtIndexPath()

还请注意(正如在注释中提到的那样)“ contentSizeUIScrollView -inherited属性,而itemSizeitemSize上的属性,允许您为每个单元指定一个大小的大小”。

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

阅读编程iOS 7,第4版 ,同时总结UICollectionViewLayout ,作者指出:

集合视图的布局工作类。 没有布局实例,集合视图不能存在! 正如我已经说过,布局知道所有子视图占用多less空间,并提供设置collection视图的contentSize的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()不仅仅是返回内容大小。 我认为调用它实际上启动了布局计算。 如果在这些计算过程中检测到exception,则显示警告信息。

对于我在iPad上进行testing并通过Xib启动集合视图,Xib的框架是iPhone的大小。 从viewDidLayoutSubviews触发的初始通行证处理小视图。 检查收集视图的框架,它太小了。 随后的布局引擎传递最终传递了正确的大小,但是到那时警告已经显示出来了。

接下来,我试图使Xib框架更大。 这消除了错误,但造成了更严重的问题; 布局最初是错误的。 在滚动中,当布局重新计算到正确的尺寸时,您会看到项目跳转。

可能的答案是要调用invalidateLayout() ,但我不知道在哪里。 我尝试了实例化收集视图,并没有奏效。

那么,答案呢? 我用contentSizeviewDidLayoutSubviews初始传递仍然显示不正确的大小,但最终会变好。 它不会生成任何控制台警告,更好的是,不会触发任何基于旧的帧大小的错误的布局。 更好的是,旋转是自动处理的,因为viewDidLayoutSubviews会自动调用内容大小将被更新的点。