web-dev-qa-db-fra.com

surligner la cellule uicollectionview au robinet

J'ai un menu coulissant que j'ai implémenté en tant que UICollectionViewController. J'ai également créé des cellules personnalisées pour la vue Collection. La navigation et tout fonctionne comme prévu. Ce qui me pose problème, c'est de changer l'apparence des cellules lorsque je clique sur une cellule réelle. 

J'ai essayé plusieurs approches basées sur des solutions ( 1 ) ( 2 ) que j'ai vues ici sur pile mais rien à ma satisfaction. 

Solution 1: implémente les méthodes de délégué UICollectionViewController:

class SlideOutMenuViewController: UICollectionViewController, UICollectionViewDelegateFlowLayout{
   //Setup code and other delegate methods….

    override func collectionView(_ collectionView: UICollectionView, didHighlightItemAt indexPath: IndexPath) {
        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: cellId, for: indexPath) as! SlideOutMenuCells

        cell.backgroundColor = .white
    }

    override func collectionView(_ collectionView: UICollectionView, didUnhighlightItemAt indexPath: IndexPath) {
        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: cellId, for: indexPath) as! SlideOutMenuCells

        cell.backgroundColor = UIColor.mainGreen()
    }
}

Quand j'ai essayé cette solution, rien ne se passe. La couleur de fond des cellules ne change pas de couleur. 

Solution 2: cette solution donne de meilleurs résultats, sauf que la cellule change de couleur lorsque je la tiens. J'aimerais que la couleur d'arrière-plan des cellules clignote ou soit surlignée rapidement sur un tapotez et pas vraiment si l'utilisateur maintient la cellule enfoncée. 

class SlideOutMenuCells: UICollectionViewCell {

    //Setup code...

    override var isHighlighted: Bool {
        didSet {
            if self.isHighlighted {
                backgroundColor = UIColor.darkGreen()
            } else {
                backgroundColor = UIColor.mainGreen()
            }
        }
    }
}

Aucune des deux solutions ne fonctionne vraiment comme prévu. J'ai lu plusieurs billets ici qui tentent de résoudre ce problème, mais je n'en ai trouvé aucun avec une solution qui fonctionne vraiment. Je voudrais que la cellule clignote en surbrillance avec un robinet, et pas seulement lorsqu'un utilisateur clique et maintient sur une cellule ...

7
mufc

Voici un code de travail pour mettre en surbrillanceUICollectionViewCellon tap (Swift 4)

Vous n'avez rien à faire dans votre classe UICollectionViewCell.

class StoreListViewController: UIViewController,UICollectionViewDelegate,UICollectionViewDataSource {

    var previousSelected : IndexPath?
    var currentSelected : Int?

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

    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {

        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "StoreCollViewCell", for: indexPath) as! StoreCollViewCell

        cell.lblofferscount.text = "Cell \(indexPath.row)"

        // To set the selected cell background color here
        if currentSelected != nil && currentSelected == indexPath.row
        {
            cell.backgroundColor = UIColor.green
        }
        else
        {
            cell.backgroundColor = UIColor.yellow
        }

        return cell     
    }

    func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {

        // For remove previously selection 
        if previousSelected != nil{
            if let cell = collectionView.cellForItem(at: previousSelected!){
                cell.backgroundColor = UIColor.yellow
            }
        }
        currentSelected = indexPath.row
        previousSelected = indexPath

        // For reload the selected cell
        self.collVwStores.reloadItems(at: [indexPath]) 
    }
}

Sortie

 enter image description here

 enter image description here

5
Nikunj Kumbhani

Vous pouvez essayer d'utiliser UILongPressGestureRecognizer pour indiquer la sélection: 

override func awakeFromNib() {
    super.awakeFromNib()

    let tapGesture = UILongPressGestureRecognizer(target: self, action: #selector(didTap(recognizer:)))
    tapGesture.minimumPressDuration = 0
    tapGesture.cancelsTouchesInView = false
    addGestureRecognizer(tapGesture)
}

@objc func didTap(recognizer: UILongPressGestureRecognizer) {
    if recognizer.state == .began {
        backgroundColor = .red
    }
    if recognizer.state == .ended {
        backgroundColor = .green
    }
}

ou vous pouvez faire extension pour UICollectionViewCell

extension UICollectionViewCell {
func makeSelectionIndicatable() {
    let tapGesture = UILongPressGestureRecognizer(target: self, action: #selector(didTap(recognizer:)))
    tapGesture.minimumPressDuration = 0
    tapGesture.cancelsTouchesInView = false
    addGestureRecognizer(tapGesture)
}

@objc private func didTap(recognizer: UILongPressGestureRecognizer) {
    if recognizer.state == .began {
        backgroundColor = .red
    }
    if recognizer.state == .ended {
        backgroundColor = .green
    }
}

}

et après cela, pour toute cellule à la méthode awakeFromNib(), il vous suffit d’ajouter makeSelectionIndicatable()

1
rubik

Vous pouvez le faire en modifiant la couleur si la vue du contenu dans la cellule ressemble à ceci: 

class SlideOutMenuCells: UICollectionViewCell {

override var isSelected: Bool {
    didSet {
        self.contentView.backgroundColor = isSelected ? OLTheme.Colors.Selected_Voucher_Color : UIColor.clear
    }
} 
}
0
Adnan Munir