1
votes

Animer la cellule de vue de collection lors d'un clic dans Swift

J'essaye d'animer la cellule de la vue de collection en cliquant comme ceci, entrez la description de l'image ici

J'ai essayé du code mais il ne donne pas une animation parfaite, ceci est mon code

 func collectionView(_ collectionView: UICollectionView, didHighlightItemAt indexPath: IndexPath) {
    UIView.animate(withDuration: 0.8) {
        if let cell = self.subCategoryCollectionView.cellForItem(at: indexPath) as? LawyerSubCategoryCVC {
            cell.transform = .init(scaleX: 1.5, y: 1.5)
        }
    }
}

Ceci est me donnant ce résultat, entrez la description de l'image ici

Comment puis-je obtenir cette animation parfaite en cliquant sur la cellule de vue de la collection?


2 commentaires

peut-être que l'article vous aidera stackoverflow.com/questions/46098693 /…


J'ai suivi le lien, c'est ce que je veux, mais lorsque j'ai appliqué cette animation, je reçois un problème lors de la sélection d'une cellule. la taille de la cellule augmente mais ne couvre pas la bordure de la cellule comme indiqué dans ma deuxième image. @Bogdan Sasko


3 Réponses :


0
votes

Je pense que vous pouvez définir la hauteur de cellule pour l'élément sélectionné, cela vous aidera.


3 commentaires

juste augmenter la hauteur de la cellule? @Rakesh


Oui, vous pouvez essayer simplement d'augmenter la taille de l'élément sélectionné et réinitialiser la taille de l'élément sera plus petite que la cellule sélectionnée. ou vous pouvez ajouter la même taille de cellule pour tous et vous pouvez mettre à l'échelle une sous-vue pour l'élément sélectionné. dans la cellule pour la ligne à l'indexpath.


Comment faire ça, pouvez-vous expliquer par le code? Rakesh



1
votes
import UIKit
extension UIColor {
    static var random: UIColor {
        return UIColor(red: .random(in: 0...1),
                       green: .random(in: 0...1),
                       blue: .random(in: 0...1),
                       alpha: 1.0)
    }
}
class ViewController: UIViewController ,UICollectionViewDelegate,UICollectionViewDataSource,UICollectionViewDelegateFlowLayout{

@IBOutlet weak var collectionView: UICollectionView!
var selectedIndex = 2
override func viewDidLoad() {
    super.viewDidLoad()
 }


func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
    return 10
}

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "CollectionViewCell", for: indexPath)
    cell.contentView.backgroundColor = UIColor.random
    return cell
}

func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
    self.selectedIndex =  indexPath.row
    collectionView.reloadData()
}
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {

    let noOfCellsInRow = 4

    let flowLayout = collectionViewLayout as! UICollectionViewFlowLayout

    let totalSpace = flowLayout.sectionInset.left
        + flowLayout.sectionInset.right
        + (flowLayout.minimumInteritemSpacing * CGFloat(noOfCellsInRow - 1))

    let size = Int((collectionView.bounds.width - totalSpace) / CGFloat(noOfCellsInRow))
    if selectedIndex == indexPath.row {
        return CGSize(width: size, height: size + 40)
     }
    return CGSize(width: size, height: size)
}
}

1 commentaires

vous devez donc mettre à l'échelle la cellule sélectionnée dans cellforrowatindexpath



0
votes

Pour faire apparaître la cellule, vous devez changer la zPosition de la cellule. Par exemple:

class MyCell: UICollectionViewCell {
    override var isSelected: Bool {
        didSet {
            UIView.animate(withDuration: 0.3, delay: 0.0, options: .curveEaseOut, animations: {
                self.layer.zPosition = self.isSelected ? 1 : -1
                self.transform = self.isSelected ? CGAffineTransform(scaleX: 1.2, y: 1.2) : CGAffineTransform.identity
            }, completion: nil)
        }
    }

    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)

        layer.borderWidth = 1
        layer.cornerRadius = 4
        layer.borderColor = UIColor.clear.cgColor

        layer.shadowOpacity = 0.2
        layer.shadowOffset = CGSize(width: 0, height: 2)
        layer.shadowRadius = 4
        layer.shadowColor = UIColor.black.cgColor
        layer.masksToBounds = false
    }
}

Veuillez suivre le lien pour voir le résultat


3 commentaires

Le code fonctionne bien mais je suis confronté à un problème avec votre code lorsque je touche la cellule, il se déplace vers le haut et son rayon de coin disparaît et il prend la forme d'un carré comme la capture d'écran que je joins en question. @bohdans


@JunaidKhan Je ne vois pas le problème que vous avez décrit. Veuillez ouvrir un lien que j'ai joint.


Quelle est la taille de la cellule et la taille de la vue placée dans la vue de collection? J'ai la hauteur de ma cellule attachée à la vue de la collection et la hauteur et la largeur de la vue sont attachées à la cellule. @bohdans