iOS UICollectionView 与自定尺寸项目错误?
Posted
技术标签:
【中文标题】iOS UICollectionView 与自定尺寸项目错误?【英文标题】:iOS UICollectionView with self sizing items bug? 【发布时间】:2016-11-15 14:49:16 【问题描述】:我正在尝试使用自定义大小的项目来实现 UICollectionView (flowLayout)。
实现非常简单——我刚刚设置了estimatedItemSize 并设置了UICollectionViewCell 约束来管理它的大小。
在创建collectionView 后第一次重新加载数据时一切正常,但在另一个或其他一些重新加载时,顶部的几个项目的大小与estimatedItemSize 的大小相同。如果向下和向上滚动 - 项目大小再次看起来不错。
我在这个问题上花了 2 天时间来试验不同的单元格约束,尝试在不同的地方设置需要的布局以及 collectionView 周围的其他东西。是bug吗?
【问题讨论】:
【参考方案1】:在this post 中,我遇到了一个有趣的问题,我找到了自己的答案。有两个重要的函数可以正确用于调整大小,它们是:
minimumInteritemSpacingForSectionAtIndex
insetForSectionAtIndex
sizeForItemAtIndexPath
我在 Swift 中使用它们的示例
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionView, minimumInteritemSpacingForSectionAtIndex section: Int) -> CGFloat
return 0
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, insetForSectionAtIndex section: Int) -> UIEdgeInsets
return UIEdgeInsetsMake(0, 0, 0, 0)
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAtIndexPath indexPath: IndexPath) -> CGSize
let screenRect: CGRect = collectionView.bounds
let screenWidth: CGFloat = screenRect.size.width
let cellWidth: CGFloat = screenWidth / 24
//Replace the divisor with the column count requirement. Make sure to have it in float.
let size: CGSize = CGSize(width: cellWidth, height: cellWidth)
return size
最大的秘密是在将视图附加到后沿和底部布局时要小心。如果您只将它们附加到前导和顶部,那么您可以通过框架或约束以编程方式设置宽度和高度。我认为通过约束来实现更直接一些,尽管在我的个人项目中我选择了另一种方式,因为在我看来它使功能更清晰。
尝试在 cellForItemAt 内尽可能多地完成单元格布局。
【讨论】:
您建议主要在cellForItemAt
中进行布局非常有帮助。谢谢!以上是关于iOS UICollectionView 与自定尺寸项目错误?的主要内容,如果未能解决你的问题,请参考以下文章
ios UITableView 与 fetchedresultscontroller - 添加自定义行
[IOS] - UITableView 与 UICollectionView API及其使用
iOS-UICollectionViewLayout方法介绍