首页 > 解决方案 > 如何在不破坏其他单元格的情况下为集合视图插入设置动画?

问题描述

我有一个collectionView,其中单元格向左对齐,单元格宽度基于字符串长度。类似于标签视图布局。

我查找了有关如何为插入设置动画的快速教程:https ://littlebitesofcocoa.com/306-customizing-collection-view-cell-insertion-animations

上一行的单元格展开并缩回到原来的位置。

我尝试在没有动画的情况下插入单元格,并且发生了同样的事情,这是由于左对齐布局具有可变单元格宽度。

这是在自定义 UICollectionViewFlowLayout 中将单元格向左对齐的代码:

override func layoutAttributesForElements(in rect: CGRect) -> [UICollectionViewLayoutAttributes]? {
        let attributes = super.layoutAttributesForElements(in: rect)

        var leftMargin = sectionInset.left
        var maxY: CGFloat = -1.0
        attributes?.forEach { layoutAttribute in
            if layoutAttribute.frame.origin.y >= maxY {
                leftMargin = sectionInset.left + 8
            }

            layoutAttribute.frame.origin.x = leftMargin

            leftMargin += layoutAttribute.frame.width + minimumInteritemSpacing
            maxY = max(layoutAttribute.frame.maxY , maxY)
        }

        return attributes
    }

并通过以下方式制作动画:

override func initialLayoutAttributesForAppearingItem(at itemIndexPath: IndexPath) -> UICollectionViewLayoutAttributes? {
        let attributes = super.initialLayoutAttributesForAppearingItem(at: itemIndexPath)

        if insertingIndexPaths.contains(itemIndexPath) {
            attributes?.alpha = 0.0
            attributes?.transform = CGAffineTransform(
                translationX: 0,
                y: 500
            )
        }

        return attributes
    }

我希望它看起来像这样: https ://imgur.com/cbWq6CI

但它看起来像这样(实际录制): https ://imgur.com/xfKZYnr

标签: swiftuicollectionview

解决方案


我的UICollectionViewFlowLayout子类中有这个代码:

required init(minimumInteritemSpacing: CGFloat = 8, minimumLineSpacing: CGFloat = 8, sectionInset: UIEdgeInsets = .zero) {
    super.init()
    estimatedItemSize = UICollectionViewFlowLayout.automaticSize
    self.minimumInteritemSpacing = minimumInteritemSpacing
    self.minimumLineSpacing = minimumLineSpacing
    self.sectionInset = sectionInset
    sectionInsetReference = .fromSafeArea
}

required init?(coder aDecoder: NSCoder) {
    fatalError("init(coder:) has not been implemented")
}

我刚刚删除estimatedItemSize = UICollectionViewFlowLayout.automaticSize,没有额外的动作。


推荐阅读