contentSize
是一个属性UIScrollView
, 然而collectionViewContentSize()
是一种方法UICollectionViewLayout
.
Reading iOS 7 编程,第四版 http://shop.oreilly.com/product/0636920031017.do,同时总结UICollectionViewLayout
,作者指出:
集合视图的布局主力类。集合视图
没有布局实例就不可能存在!正如我已经说过的,
布局知道所有子视图占用多少空间,并且供应
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
正在处理小视图。检查集合视图的框架,它was太小。随后的布局引擎最终传递了正确的尺寸,但那时警告已经显示了。
接下来,我尝试将 Xib 框架做得更大。这消除了错误,但导致了更严重的问题;布局最初是错误的。在滚动时,您会看到随着布局重新计算到正确的尺寸,项目会四处跳跃。
答案可能是打电话invalidateLayout()
,但我不确定在哪里。我在实例化集合视图后尝试过,但没有成功。
那么,答案是什么呢?我用了内容大小。初始传入viewDidLayoutSubviews
仍然显示不正确的尺寸,但最终会正常。它不会生成任何控制台警告,更好的是,不会根据旧的帧大小触发任何错误的布局。更好的是,旋转是自动处理的viewDidLayoutSubviews
将被自动调用,此时内容大小将被更新。