在我的
UICollectionView
中,我使用委托方法为不同的 cell
项目设置了不同的高度:
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
switch indexPath.item {
case 0:
return CGSize(width: view.frame.width, height: view.frame.width/2)
case 1:
return CGSize(width: view.frame.width, height: 250)
case 2:
return CGSize(width: view.frame.width, height: view.frame.width/2)
default:
return CGSize(width: view.frame.width, height: view.frame.width)
}
}
现在给定
indexPath
,我想获取之前为特定 cell
项目指定的高度。
您可以从控制器调用委托方法。
collectionView(collectionView, layout: collectionView.collectionViewLayout, sizeForItemAt: indexPath)
如果您已经设置了 UICollectionView 并且稍后您想要获取任何单元格的高度,您可以使用以下方法来获取单元格的高度
cellForItem(at:)
您可以将此方法与 UICollectionView 对象一起使用来获取特定索引处的单元格。 当您获得任何特定单元格时,您可以使用该单元格内的
contentView
框架检查该单元格的高度
Apple 文档:UICollectionView cellForItem
如果您想在第一次设置后更新单元格大小,您可以调用 UICollectionView 的 collectionViewLayout 属性的
invalidateLayout
方法。此方法会重新生成您的布局,在您的情况下这意味着还要调用 -collectionView: layout: sizeForItemAtIndexPath:
,这是反映您所需的项目大小的正确位置。
无效布局
使当前布局无效并触发布局更新。您可以随时调用该方法来更新布局信息。 此方法使集合视图本身的布局无效,并且 立即返回。因此,您可以多次调用此方法 同一代码块,不会触发多个布局更新。这 实际布局更新发生在下一个视图布局更新周期期间。
您可以向
collectionViewLayout
询问布局属性,这将为您提供高度等信息:
let layoutAttributes = collectionView.collectionViewLayout.layoutAttributesForItem(at: indexPath)
let height = layoutAttributes?.frame.height
使用数组来存储每个
cell
的大小。
因此,当您想知道
cell[i]
之前的大小时,它将位于 array[i-1]
位置。