为什么我的UICollectionViewCells在动画超级视图约束发生变化时会改变alpha值?

时间:2016-10-09 02:33:57

标签: ios autolayout uicollectionview uicollectionviewcell

我有一个包含多个子视图的超级视图,包括一个UICollectionView。 superview具有布局约束,将其位置固定到屏幕底部。我想通过更改该约束然后在UIViewController上调用self.view.layoutIfNeeded()来隐藏视图。除了在动画开始时UICollectionView的单元格下降到alpha = 0,然后在结尾处更改回alpha = 1之外,这样可以正常工作。

动画很快就不会引人注目,但我不明白为什么会这样。没有其他子视图具有此行为,并且UICollectionView本身不会更改alpha ...只有单元格。

要隐藏我打电话的超级视图:

entryOffset.constant = entryHeight.constant
UIView.animateWithDuration(5, animations: {
    self.view.layoutIfNeeded()
  }) { (finished) in
}

由于动画速度慢(5秒),很明显细胞完全隐藏......然后淡入。我内心已经破了:

func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {}

你可以看到正在重新加载单元格(我也不明白,因为它只是已经改变的上层约束......而不是UICollectionView本身。

有关为什么细胞的alpha值正在改变以及如何防止这种情况的任何想法?

1 个答案:

答案 0 :(得分:2)

我通过子类化流程布局得到了单元格的alpha值不会改变:

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
    }

}