UICollectionViewCell在滚动时更改单元格大小

我试图创build一个UICollectionView,其中UICollectionViewCell在“离开”顶部或底部的可见区域时被缩小。 在“进入”可见区域时,按比例放大到正常大小。

我一直在尝试一些缩放/animation代码: scrollViewDidScroll() ,但我似乎无法得到正确的。

我的完整function如下所示:

  func scrollViewDidScroll(scrollView: UIScrollView) { var arr = colView.indexPathsForVisibleItems() for indexPath in arr{ var cell = colView.cellForItemAtIndexPath(indexPath as! NSIndexPath)! var pos = colView.convertRect(cell.frame, toView: self.view) if pos.origin.y < 50 && pos.origin.y >= 0{ cell.hidden = false UIView.animateWithDuration(0.5, animations: { () -> Void in cell.transform = CGAffineTransformMakeScale(0.02 * pos.origin.y, 0.02 * pos.origin.y) }) }else if pos.origin.y == 50{ UIView.animateWithDuration(0.5, animations: { () -> Void in cell.transform = CGAffineTransformMakeScale(1, 1) }) } } } 

这在某种程度上是正确的方法,还是有另一种更好的方法?

不是一个完整的解决scheme,而是一些评论/指针:

  1. 您不应该直接以这种方式UICollectionViewLayout集合视图单元格,而应该有一个自定义的UICollectionViewLayout子类,它修改UICollectionViewLayoutAttributes以包含所需的transform并在必要时使布局无效。

  2. 这样做, if pos.origin.y == 50肯定不是一个好主意,因为滚动可能不会传递所有的值(也就是说,它可能从45跳到53)。 因此,如果要确保只在“边界”处执行一次animation(例如,存储最后一个位置或一个标记),请使用>=并包含其他一些方法。