【问题标题】:UICollectionView: different size items is not calculated on reused itemsUICollectionView:不同大小的项目不计算重复使用的项目
【发布时间】:2012-11-10 01:24:30
【问题描述】:

我有一个包含不同项目大小的集合视图,我在

中声明
- (CGSize)collectionView:(UICollectionView *)collectionView
                  layout:(UICollectionViewLayout*)collectionViewLayout
  sizeForItemAtIndexPath:(NSIndexPath *)indexPath {

    FeedItem *item = [_imagesLinkArray objectAtIndex:indexPath.row];
    return CGSizeMake(250, 200*item.sizeFactor);
}

当单元格在collectionView:cellForItemAtIndexPath:中被重用时 该项目正在以重新使用的项目大小而不是sizeForItemAtIndexPath:中指定的大小呈现。

有什么想法吗?

【问题讨论】:

  • 你能分享你的 collectionView:cellForItemAtIndexPath: 方法吗?此外,是否有可能您的单元格中的一个子视图的大小与单元格无关,导致它看起来只是单元格没有被调整大小?
  • 这方面有什么进展吗? sizeForItemAtIndexPath: 当我滚动并且单元格被重用时没有被重新计算。
  • 当我向下滚动单元格时,我遇到了同样的问题得到不同的对齐方式(比如丢失单元格之间的最小空间)

标签: ios uicollectionview uicollectionviewcell


【解决方案1】:

似乎 collectionView:layout:sizeForItemAtIndexPath: 在布局准备时被调用一次,在 CollectionView 被渲染之前。

因此,每当您滚动并且单元格出列时,它都会在准备阶段调整为collectionView:layout:sizeForItemAtIndexPath: 提供的大小。您是否希望在具有特定 indexPath 的单元格可见时调用此方法?这样您就可以动态更改单元格大小?看来这不是这种方法可以使用的方法,它可以在布局准备阶段用于确定单元格的大小。

如果您出于某种原因需要重新计算尺寸,您可以使用 [UICollectionViewLayout invalidateLayout] 使布局无效。

【讨论】:

    【解决方案2】:

    集合视图重新计算项目的频率似乎低于UITableView。您必须将底层模型的大部分更改通知集合视图,例如通过调用[collectionView reloadData][collectionView insertItemsAtIndexPaths:indexPaths]

    【讨论】:

    • 这个答案为我指明了正确的方向。在collectionView:layout:sizeForItemAtIndexPath 上返回CGSize 之前调用reloadData 创造了奇迹!谢谢!
    • 如何传播到单元格?
    【解决方案3】:

    如果您使用自定义布局,则需要在自定义布局类中覆盖此函数。

    override func shouldInvalidateLayoutForBoundsChange(newBounds: CGRect) -> Bool {
    return true
    }
    

    【讨论】:

      【解决方案4】:

      您可以简单地覆盖滚动视图委托

      func scrollViewDidScroll(_ scrollView: UIScrollView) {
          collectionView.collectionViewLayout.invalidateLayout()
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-01-12
        • 2019-01-01
        • 2016-12-19
        • 1970-01-01
        • 1970-01-01
        • 2022-08-23
        • 2021-12-12
        • 1970-01-01
        相关资源
        最近更新 更多