【问题标题】:How to sync cell expand/collapse and collectionview animations?如何同步单元格展开/折叠和 collectionview 动画?
【发布时间】:2021-10-26 09:55:08
【问题描述】:

我有一个带有可扩展单元格的 UICollectionView(只需将以下代码粘贴到一个空项目中(xcode - new - 带有故事板的 uikit 应用程序),它就可以工作):

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

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

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

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

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

【问题讨论】:

    标签: ios swift uicollectionview uikit


    【解决方案1】:

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

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

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

    【讨论】:

    • 现在它可以正确地为最近的单元格设置动画,但从单元格 #6 开始,它们只是出现/消失而没有任何动画:i.imgur.com/78TOAL1.gif
    【解决方案2】:

    试试这个:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-08-23
      • 2011-09-12
      • 1970-01-01
      • 2018-07-31
      • 1970-01-01
      • 1970-01-01
      • 2017-03-09
      相关资源
      最近更新 更多