Пользовательская анимация UICollectionViewFlowLayout

У меня есть пользовательская анимация UICollectionViewFlowLayout, которая с помощью вставки и слева направо отображает представления справа и слева. Он делает это, устанавливая CABasicAnimation на UICollectionViewLayoutAttributes и применяя это к клеточному уровню.

Захват экрана

Проект CollectionViewAnimations на GitHub

Альфа по умолчанию - 0 и его затухание моих ячеек и окончание моей пользовательской анимации раньше. Если я изменил альфу на 1, то я вообще не вижу анимацию. Я установил его в 0.5, и я получу немного... это странно. Вы должны запустить мой проект, чтобы понять, что я имею в виду.

AnimatingFlowLayout.swift

По какой-то причине я не могу полностью удалить стандартную альфу для атрибутов в finalLayoutAttributesForDisappearingItemAtIndexPath.

У кого-нибудь есть идеи?

Ответ 1

Вы используете performBatchUpdates(_:completion:), который уже анимирует изменения, установленные в finalLayoutAttributesForDisappearingItemAtIndexPath(_:), поэтому, если вы добавите CABasicAnimation, вы добавляете анимацию в анимацию, которая уже произойдет. Если вы отбрасываете анимацию из CellLayoutAttributes и просто устанавливаете transform3D of UICollectionViewLayoutAttributes, она будет делать то, что вы хотите (кроме анимации beginTime и fillMode). Этот фрагмент кода хорошо работает для меня:

override func finalLayoutAttributesForDisappearingItemAtIndexPath(itemIndexPath: NSIndexPath) -> UICollectionViewLayoutAttributes? {
    let attributes: CellLayoutAttributes = super.finalLayoutAttributesForDisappearingItemAtIndexPath(itemIndexPath) as! CellLayoutAttributes
    // Default is 0, if I set it to 1.0 you don't see anything happen..'
    attributes.alpha = 1
    let endX = -CGRectGetWidth(self.collectionView!.frame)
    var endTransform: CATransform3D = CATransform3DMakeTranslation(endX, 0, 0)
    attributes.transform3D = endTransform

    return attributes
} 

Ответ 2

Это сработало для меня, для аналогичной проблемы:

import UIKit

class NoFadeFlowLayout: UICollectionViewFlowLayout {

    override func initialLayoutAttributesForAppearingItem(at itemIndexPath: IndexPath) -> UICollectionViewLayoutAttributes? {
        let attrs = super.initialLayoutAttributesForAppearingItem(at: itemIndexPath)
        attrs?.alpha = 1.0
        return attrs
    }

    override func finalLayoutAttributesForDisappearingItem(at itemIndexPath: IndexPath) -> UICollectionViewLayoutAttributes? {
        let attrs = super.finalLayoutAttributesForDisappearingItem(at: itemIndexPath)
        attrs?.alpha = 1.0
        return attrs
    }

}

Вы сказали, что не можете получить альфа-версию по умолчанию в этом методе, но это сработало, когда я попробовал это на tvOS 11.