collectionViewContentSize()与contentSize
有什么区别
collectionViewController.collectionViewLayout.collectionViewContentSize()
和collectionViewController.collectionView.contentSize
?
你喜欢用什么?
collectionViewContentSize()
是一个可以覆盖(在布局中)dynamic生成大小的方法。
contentSize
是collectionView
一个属性,如果没有这样的覆盖,它将被使用。
它类似于UITableView
的rowHeight
和UITableViewDelegate
的heightForRowAtIndexPath()
。
还请注意(正如在注释中提到的那样)“ contentSize
是UIScrollView
-inherited属性,而itemSize
是itemSize
上的属性,允许您为每个单元指定一个大小的大小”。
contentSize
是UIScrollView
一个属性,而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()
,但我不知道在哪里。 我尝试了实例化收集视图,并没有奏效。
那么,答案呢? 我用contentSize 。 viewDidLayoutSubviews
初始传递仍然显示不正确的大小,但最终会变好。 它不会生成任何控制台警告,更好的是,不会触发任何基于旧的帧大小的错误的布局。 更好的是,旋转是自动处理的,因为viewDidLayoutSubviews
会自动调用内容大小将被更新的点。