12

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

- (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:.

有任何想法吗?

4

4 回答 4

5

collectionView:layout:sizeForItemAtIndexPath:在呈现 CollectionView 之前,似乎在布局准备时调用了一次。

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

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

于 2013-02-06T12:14:20.603 回答
3

集合视图似乎比UITableView. 您必须将底层模型的大部分更改通知集合视图,例如通过调用[collectionView reloadData][collectionView insertItemsAtIndexPaths:indexPaths]

于 2013-02-04T21:01:16.710 回答
0

您需要在自定义布局类中重写此函数。如果您使用自定义布局。

override func shouldInvalidateLayoutForBoundsChange(newBounds: CGRect) -> Bool {
return true
}
于 2016-01-27T13:36:46.407 回答
-1

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

func scrollViewDidScroll(_ scrollView: UIScrollView) {
    collectionView.collectionViewLayout.invalidateLayout()
}
于 2017-08-25T23:25:12.597 回答