如何在不破坏其他单元的情况下为collectionview插入动画?

时间:2019-01-10 02:48:17

标签: swift uicollectionview

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

我查阅了有关如何使插入物动起来的快速教程:https://littlebitesofcocoa.com/306-customizing-collection-view-cell-insertion-animations

上一行的单元格会展开并缩回其原始位置。

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

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

pd.concat

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

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
    }

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

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

1 个答案:

答案 0 :(得分:0)

我的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,并且没有多余的动静。