我怎样才能实现这个 UICollectionView 单元格动画?

How can I implement this UICollectionView cell animation?

我一直想在 Dribble 上实现这个漂亮的小 UICollectionViewCell 动画。

你觉得可能吗?

我四处寻找任何指南来抢先一步,但没有发现任何相似之处。

我认为自定义流布局是解决此问题的方法。是不是我必须为每个可见单元格制作快照,向每个单元格添加平移手势,并根据通过手势识别器检测到的移动,捕获可见单元格并为快照图像设置动画?如果能帮助我理解如何实现这一点,我将不胜感激。

谢谢。

这是一个非常有趣的挑战。

我不会进行自定义布局,而是覆盖 scrollViewDidScroll,每次调用时都存储偏移量,将其与上次存储的偏移量进行比较以获得速度,并基于此应用对集合视图中所有 visibleCells 的转换。

var lastOffsetX: CGFloat?
func scrollViewDidScroll(_ scrollView: UIScrollView) {
  defer { lastOffsetX = scrollView.contentOffset.x }
  guard let lastOffsetX = lastOffsetX else { return }
  // You'll have to evaluate how large velocity gets to avoid the cells
  // from stretching too much
  let maxVelocity: CGFloat = 60
  let maxStretch: CGFloat = 10
  let velocity = min(scrollView.contentOffset.x - lastOffsetX, maxVelocity)
  let stretch = velocity / maxVelocity * maxStretch
  var cumulativeStretch: CGFloat = 0
  collectionView.visibleCells.forEach { cell in 
    cumulativeStretch += stretch
    cell.transform = CGAffineTransform(translateX: cumulativeStretch, y: 0)
  }
}

我会从这样的事情开始,并在滚动视图停止滚动时制作 lastOffsetX = nil(这个练习留给 reader)。

它可能需要一些调整。