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 与自定尺寸项目错误?的主要内容,如果未能解决你的问题,请参考以下文章

UICollectionView 的自动滚动 - iOS

ios UITableView 与 fetchedresultscontroller - 添加自定义行

[IOS] - UITableView 与 UICollectionView API及其使用

iOS-UICollectionViewLayout方法介绍

iOS 7.1 在 UIPopover 中嵌套 UICollectionView

iOS UICollectionView 记录