为啥我的 UICollectionViewCells 在动画超级视图约束更改时会更改 alpha 值?

Posted

技术标签:

【中文标题】为啥我的 UICollectionViewCells 在动画超级视图约束更改时会更改 alpha 值?【英文标题】:Why do my UICollectionViewCells change alpha value when animating a superview constraint change?为什么我的 UICollectionViewCells 在动画超级视图约束更改时会更改 alpha 值? 【发布时间】:2016-10-09 02:33:57 【问题描述】:

我有一个包含多个子视图的超级视图,包括一个 UICollectionView。超级视图有一个布局约束,将其位置固定在屏幕底部。我想通过更改该约束然后在 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】:

通过对流布局进行子类化,我使单元格的 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
    


【讨论】:

以上是关于为啥我的 UICollectionViewCells 在动画超级视图约束更改时会更改 alpha 值?的主要内容,如果未能解决你的问题,请参考以下文章

为啥向 UICollectionViewCell 中的按钮添加操作效果不佳?

为啥点击 UICollectionViewCell 上的文本会消失?

为啥 UICollectionViewCell 在 Interface Builder Xcode7.1 OS X Yosemite 中的出口为零?

如何为我的自定义 UICollectionViewCell 设置属性

调整我的 UICollectionViewCell 大小的问题

如何让我的 UICollectionViewCell 阴影渗入我的主视图?