Как сохранить одинаковый межстрочный интервал для горизонтального UICollectionviewCell после применения преобразования масштабирования ячейки

У меня есть одно горизонтальное представление UICollection, где мне нужно преобразовать или уменьшить размер невыбранных ячеек. Я задал общий размер в функции делегата 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)
    }
}

Ниже приведен вывод, который я получаю с этим кодом,

введите здесь описание изображения

На приложенном скриншоте видно, как меняются промежутки между ячейками.




Ответы (1)


Я считаю, что происходит то, что преобразование происходит независимо от макета представления коллекции. Расположение ячейки не связано с преобразованием, поэтому оно не влияет на интервал.

Возможно, вы сможете решить эту проблему, установив размер ячеек в функции sizeForItemAt. В этой функции попробуйте посмотреть, находится ли indexPath в collectionView.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()
}

Я не уверен, как с этим будет работать анимация или останутся ли другие ячейки по центру или нет, но попробовать стоит.

person RPK    schedule 19.11.2020