Пользовательская анимация 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.