UICollectionView:不会对重用项目计算不同大小的项目

时间:2012-11-10 01:24:31

标签: ios uicollectionview uicollectionviewcell

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

中声明
- (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 个答案:

答案 0 :(得分:5)

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

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

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

答案 1 :(得分:3)

集合视图似乎比UITableView更少地重新计算项目。您必须通知集合视图有关基础模型的大多数更改,例如致电[collectionView reloadData][collectionView insertItemsAtIndexPaths:indexPaths]

答案 2 :(得分:0)

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

Sub CreateHyperLink()
Dim URL As String
URL = InputBox("Enter the link")
With Worksheets("Sheet1")
.Hyperlinks.Add Anchor:=.Range("A5"), _
Address:="http://www." & URL, _
TextToDisplay:="Google"
End With
End Sub

答案 3 :(得分:0)

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

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