如何在UICollectionView滚动时将CGAffineTransform应用于UICollectionViewCell

时间:2018-02-04 23:21:23

标签: ios swift uiscrollview uicollectionview

我正在创建一种水平滚动菜单,其中包含多个项目,用户可以滚动浏览。(请参阅底部的图片以预览我的意思)

UICollectionView偏移量始终以其中一个项目为中心。我想要做的是当一个项目是下一个接近中心的项目时,我想应用一个转换来使它更大。这是我用来实现此目的的代码(逻辑不处理动画中心或向其他方向滚动):

func scrollViewDidScroll(_ scrollView: UIScrollView) {
        guard let scrolledCollectionView = scrollView as? UICollectionView,
            let flowLayout = scrolledCollectionView.collectionViewLayout as? UICollectionViewFlowLayout else { return }

        let itemWidth = flowLayout.itemSize.width

        let collectionViewCenter = collectionView.bounds.width * 0.5 + scrolledCollectionView.contentOffset.x

        let itemToEnlarge = Int((scrolledCollectionView.contentOffset.x + (itemWidth * 0.5)) / (itemWidth + flowLayout.minimumInteritemSpacing))

        let itemEnlargeIndexpath = IndexPath(row: itemToEnlarge, section: 0)

        guard let cellToAnimate = collectionView.cellForItem(at: itemEnlargeIndexpath) else { return }

        let diff = cellToAnimate.center.x - collectionViewCenter

        var transformationVolume: CGFloat = 1

        if diff == 0 {
            transformationVolume += 0.2
        } else {
            transformationVolume += (0.2 / diff)
        }

        DispatchQueue.main.async {
            cellToAnimate.transform = CGAffineTransform(scaleX: transformationVolume, y: transformationVolume)
        }
    }

我遇到的问题是只有在collectionview停止滚动后才会应用转换。有谁知道是否有办法动态应用转换?因此,如果您逐渐将项目向中心滚动,则会逐步应用转换。

enter image description here

0 个答案:

没有答案