如何同步单元格 expand/collapse 和 collectionview 动画?

How to sync cell expand/collapse and collectionview animations?

我有一个带有可扩展单元格的 UICollectionView(只需将以下代码粘贴到一个空项目中(xcode - 新的 - 带情节提要的 uikit 应用程序):

https://gist.github.com/smocer/e8c4bb3c5465c1a01bcf6aa33e0fd9dc

当单元格展开和 collectionview 布局更新动画不同步时我遇到了一个问题(单元格立即展开,而其他单元格移动平滑):

值得注意的是,出于某种原因,折叠动画实际上与 UICollectionView 动画同步。

问题是,如何在不使用 hack 或解决方法的情况下同步它们?我的意思是,我可以使用 Core Animation 向 Cell 层添加一些动画,但是,我必须手动调整持续时间值,因为我不知道 UICollectionView 需要多长时间才能为其项目设置动画。

如果不可能,最好的方法是什么?

如果您只是更改单元格的布局,则无需重新加载它,您可以使它无效 collectionViewLayout:

func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
    isExpanded[indexPath.item].toggle()
    
    collectionView.collectionViewLayout.invalidateLayout()
    UIView.animate(withDuration: 0.25) {
        collectionView.layoutIfNeeded()
    }
}

现在项目以相同的动画持续时间展开/折叠,您也可以调整。

试试这个:

UIView.animate(withDuration: 0.3) {
    collectionView.performBatchUpdates({}) { _ in
        collectionView.layoutIfNeeded()
    }
}