我正在创建一种水平滚动菜单,其中包含多个项目,用户可以滚动浏览。(请参阅底部的图片以预览我的意思)
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停止滚动后才会应用转换。有谁知道是否有办法动态应用转换?因此,如果您逐渐将项目向中心滚动,则会逐步应用转换。