1

我有一个水平 UICollectionview,我需要在其中转换或减小未选中单元格的大小。我在 sizeForItem 委托函数中为所有单元格提供了一个通用大小。我已经给出了在单元格之间保持的最小行间距。但是当重新缩放单元格时的问题可以说(0.8 缩放)单元格之间的空间越来越宽并且不能保持共同的大小。

这是collectionView的一些代码片段,

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
    return CGSize(width: 400, height: 400)


func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, insetForSectionAt section: Int) -> UIEdgeInsets {

    return UIEdgeInsets(top: 0, left: 24, bottom: 24, right: 24)
}

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumLineSpacingForSectionAt section: Int) -> CGFloat {
    return 20
}

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "Cell", for: indexPath) as? SomeCellClass
    cell.loadUI()
        
        if indexPath == selectedIndex {
            cell?.performScaleTransformation(reScale: false)
        }
        else{
            cell?.performScaleTransformation(reScale: true)
        }
    }
    return cell ?? UICollectionViewCell()
}

///这个函数在Cell类 SomeCellClass: UICollectionviewCell

func performScaleTransformation(reScale: Bool) {
   
    if reScale {
        UIView.animate(withDuration: 0.3, delay: 0.0, options: [ .curveEaseOut], animations: {
            self.transform = CGAffineTransform(scaleX: 0.8, y: 0.8)
        }, completion: nil)
    }
    else {
        UIView.animate(withDuration: 0.3, delay: 0.0, options: [ .curveEaseOut], animations: {
            self.transform = .identity
        }, completion: nil)
    }
}

下面是我用这段代码得到的输出,

在此处输入图像描述

从随附的屏幕截图中,您可以看到单元格之间的空间是如何变化的。

4

1 回答 1

0

我相信正在发生的事情是转换独立于集合视图的布局发生。单元格的布局不受变换约束,因此不影响间距。

您可以通过设置sizeForItemAt函数中单元格的大小来解决此问题。在该功能中,尝试查看是否indexPathcollectionView.indexPathsforSelectedItems其中并调整其中的大小。

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
    if collectionView.selectedIndexPaths.contains(indexPath){
        return CGSize(width: 400.0, height: 400.0)
    } else {
        return CGSize(width: 320.0, height: 320.0)
    }
}

如果这样做,您很可能必须在每次选择后使布局无效

func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
    collectionView.collectionViewLayout.invalidateLayout()
}

我不确定动画将如何使用它,或者其他单元格是否会保持居中,但值得一试。

于 2020-11-19T01:36:31.337 回答