首页 > 解决方案 > 缩放正在交互移动/重新排列的动画 UICollectionViewCell

问题描述

我有一个简单的水平集合视图,并且可以使用长按手势交互地重新排列此集合中的单元格。

原始布局

我想要什么- 我想放大正在拖动/重新排列的单元格,使其看起来与众不同并且我的设计需要它。

我的代码是什么样子的- 我创建了一个自定义子类UICollectionViewFlowLayout并覆盖了该方法layoutAttributesForInteractivelyMovingItem(at:withTargetPosition:),并将所需的比例值分配给UICollectionViewLayoutAttributes. 我的实现如下所示:

class CustomFlowLayout: UICollectionViewFlowLayout {
  override func layoutAttributesForInteractivelyMovingItem(at indexPath: IndexPath, withTargetPosition position: CGPoint) -> UICollectionViewLayoutAttributes {
    let movingAttributes = super.layoutAttributesForInteractivelyMovingItem(at: indexPath, withTargetPosition: position)
    movingAttributes.transform = CGAffineTransform(scaleX: 1.1, y: 1.1)
    return movingAttributes
  }
}

除了上面的代码,我还在我的布局上设置了以下属性:

layout.estimatedItemSize = CGSize(width: 60, height: 60)
layout.itemSize = CGSize(width: 60, height: 60)
layout.minimumLineSpacing = 10
layout.scrollDirection = .horizontal

会发生什么- 此实现提供了非常错误的行为,导致所有单元格以随机模式放大和缩小。预计仅交互式拖动单元格的属性/比例应通过覆盖方法更改。

漏洞

预期结果- 预计只有交互式拖动单元格的属性/比例应通过覆盖方法更改。其他项目的大小和比例应保持不变。

调试期间的观察- 注释以下行(基本上,不提供具有显式值的集合视图布局estimatedItemSize):

// layout.estimatedItemSize = CGSize(width: 60, height: 60)

这导致完美的行为。scale 属性仅适用于拖动的项目,其他单元格项目不受影响。没有错误行为;一切顺利。 在此处输入图像描述

问题- 当我们明确指定时,为什么原始实现会产生错误行为estimatedItemSize

示例项目

PS - 通过反复试验和错误调试运气,我能够通过评论提到的行来产生非错误行为。没有文档提到这一点,也没有向我指出解决方案。如果这里有人知道文档是否偶然在某处提到这一点而我错过了,那就太好了。

标签: iosswiftuicollectionviewuicollectionviewlayout

解决方案


推荐阅读