Ios UIcollectionview更新单元格高度

Ios UIcollectionview更新单元格高度,ios,swift4,Ios,Swift4,目前我正在开发一个集合视图的动态布局 在collectionview单元格(ex单元格有UIbutton)内的某些单击中,该单击按钮的单元格应增加高度 我已经实现了collectionviewflowlayoutdelegate的方法 SizeforItemAt: 当单元格按钮点击时,我只是在重新加载一个特定的单元格 self.collectionview.reloadItems([indexpath]) 它将调用SizeforItemAt:但它再次调用所有单元格。正因为如此,我的collect

目前我正在开发一个集合视图的动态布局

在collectionview单元格(ex单元格有UIbutton)内的某些单击中,该单击按钮的单元格应增加高度

我已经实现了collectionviewflowlayoutdelegate的方法 SizeforItemAt:

当单元格按钮点击时,我只是在重新加载一个特定的单元格 self.collectionview.reloadItems([indexpath])

它将调用SizeforItemAt:但它再次调用所有单元格。正因为如此,我的collectionview在所有单元格的大小都在更新时都会猛拉

有没有办法只更新单个单元格的高度

你可以这样做

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize{
    let width = collectionView.bounds.width
    let height = 0.0
    // for specific cell  height
    if indexPath.row == 1{
        height = 200.0 // chnage height for a specific cell
    }else{
        height = collectionView.bounds.height //actual height
    }
    return CGSize(width: width, height: width)
}

更新

我不确定当点击按钮时它是否工作

但您可以通过实现
didSelectItemAt
来更改所选特定单元格的高度,如下所示

override func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {

    collectionView.performBatchUpdates(nil, completion: nil)

    // to reload specific cell use below line. 
    //collectionView.reloadItemsAtIndexPaths([indexPath])
}
您可以检查是否选择了
sizeForItemAt
中的
idexPath
。如果选中,则可以更改高度,否则返回原始高度。像下面这样

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {

    switch collectionView.indexPathsForSelectedItems?.first {
    case .some(indexPath):
        let height = 200.0 // here you can change the height for selected cell.
        return CGSize(width: view.frame.width,height: height) 
    default:
        let height = 200.0 // standard height
        return CGSize(width: view.frame.width, height: height)
    }
}

检查集合视图单元格动态高度

不要硬编码单元格的高度,而是让单元格内的组件定义单元格的高度。这样,当点击按钮时,实用地增加/减少该单元格内某些组件的大小,您将获得所需的结果

有没有办法只更新单个单元格的高度

否。如果实现了
sizeForItemAt:
,则可以并且将为运行时希望的任何单元格调用它。这是什么牢房不取决于你。您的工作是为所讨论的单元格返回正确的值。如果您不想更改手机的高度,请不要更改,但您无法阻止来电


然而,我怀疑这与你的问题有任何关系。听起来您想要的是以平滑(动画)的方式更新此单元格的高度。这与你问的问题无关。

不,兄弟,你没有明白我的问题。因为我正在根据我将从api获得的内容增加单元格大小。然后点击按钮后,它应该只增加一个单元格的大小。因此SizeforItemAt方法应该只调用一个单元格。@Jaimish“因此SizeforItemAt方法应该只调用一个单元格”您正在以一种奇怪的方式使用“应该”这个词。如何调用
SizeForestMat
并不取决于您。您的任务是在调用它时正确处理它。@JakirHossain如果我为某个indexpath数组重新加载Items会怎么样。对于哪个Indexath SizeForestMat:将调用?只有那些indexpath还是for all?理解并同意,但我正在调用reloadItems并传递我想要重新加载和更新高度的特定indexpath,当时为什么它调用SizeForestMat:for all单元格。它应该只调用我在重新加载时传递给的那些indexpath。希望你明白我的意思同样,你所说的涉及到“应该”的奇怪用法。你的意思可能是“我希望它能那样工作”。但我告诉你,事实并非如此。即使只重新加载了一个单元格,也会重新计算所有高度。这正是事实。你们可以随意说“应该”:这不会改变任何现实。对不起,“应该”这个词,当我点击手机上的某个按钮并更新高度时,我实际上面临着陪审团的问题。正是要以适当的滚动和平滑在集合视图中展开折叠类的东西。接受集合观点给出的现实是的,这就是我们所说的x-y问题。您不应该只询问如何更新一个单元格的高度,而应该询问如何平滑地更新单元格的高度。